- webservice的优缺点
优点:
1)跨防火墙通信
2)跨平台跨语言(应用集成)
3)跨公司的业务交易集成(B2B集成)
4)软件和数据的重用
缺点:
1)单机应用程序不适合
2)局域网内应用不适合
- webservice支持的调用方式
SOAP、XML/HTTP、RESTful HTTP 或者 CORBA
- CXF
- webservice的使用 传递string和复杂类型 对象、javabean、集合、map
- Restful理解
1)名称:Representational state transfer 表现层状态变化 主语是resourses资源 的表现层状态变化的一种架构
2)资源:网上的所有资源通过全球标识ID访问,这个地址叫做URI,通过它就能访问到网络上得任何资源
3)表现层:是指资源的一种表现形式,可以是html、txt、json、xml、或者图片格式等等
4)状态转化:是指客户端想要操作服务器资源,就需要通过某种方式对服务器资源的状态进行改变,客户端能用到的手段只能是HTTP协议,http协议里包含四种操作分别是
GET(获取资源) POST(新建资源、更新资源) 、PUT(更新资源)、Delete(删除资源)来对服务器资源改变,从而实现资源的表现层的状态变化。
- Jersy Rest 在spring 中得使用
1)导入jersy包到工程中
2)在web。xml中配置jersy的servlet
3)具体代码调用
名词解释
1 Rest Web Services
Representational State Transfer, 具象状态传输。
REST 中最重要的概念是资源(resources),使用全球 ID(通常使用 URI)标识。客户端应用程序使用 HTTP 方法(GET/ POST/ PUT/ DELETE)操作资源或资源集。RESTful Web 服务是使用 HTTP 和 REST 原理实现的 Web 服务。通常,RESTful Web 服务应该定义以下方面:
· Web 服务的基/根 URI,比如 http://host/<appcontext>/resources。
· 支持 MIME 类型的响应数据,包括 JSON/XML/ATOM 等等。
· 服务支持的操作集合(例如 POST、GET、PUT 或 DELETE)。
2 @注释说明
2.1 @Produces 表示返回的格式
@Produces( {MediaType.APPLICATION_XML }) 表示返回的xml格式
@Produces( {MediaType.APPLICATION_JSON }) 表示返回的json格式
@Produces( { MediaType.TEXT_PLAIN }) 表示返回的纯文本格式
2.2 @ Consumes
@Consumes ( { application/x-www-form-urlencoded }) 窗体数据被编码为名称/值对
@Consumes @Singleton @XmlRootElement@Provider
二、初始化工程
1下载jar包
2 新建web工程
使用MyEclipse8.5新建web工程,命名为RestfulDemo,将上述下载jar包导入lib
3 修改web.xml
添加如下内容
<servlet>
<servlet-name>ServletAdaptor</servlet-name>
<servlet-class>
com.sun.jersey.server.impl.container.servlet.ServletAdaptor
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServletAdaptor</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
4 将工程部署至tomcat
服务器生成url,例如http://localhost:8080/RestfulDemo
这个url是服务的最基本的url,后面的服务都是基于这个地址添加路径组合,例如
http://localhost:8080/RestfulDemo/HelloWorldRS
三、使用jersey开发简单的rest web services
1 @GET
1.1服务端
package com.cn;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
@Path("/HelloWorldRS") // 本服务的访问路径,与工程路径组合使用
public class HelloWorldRS {
Map<String,String> map = new HashMap<String,String>();
public HelloWorldRS() {
map.put("1","A");
map.put("2","B");
map.put("3","C");
}
@GET表明是一个GET方法
@Path("/sayHelloByGET")调用的时候要加入此路径,精确指定调用的函数
@Produces("text/html") // 输出参数的类型
public String sayHelloByGET(
@QueryParam("from")String fromValue, //客户端传来的参数key为"from"
@Context HttpServletRequest request) {
System.out.println(fromValue);
return map.get(fromValue);
}
1.2 调用1.1get服务的客户端
package com.client;
import javax.ws.rs.core.*;
import com.sun.jersey.api.client.*;
import com.sun.jersey.core.util.*;
public class JerseyClientGet {
//基础的服务url+服务类的@path
String url =
"http://localhost:8080/RestfulDemo/HelloWorldRS";
public static void main(String[] args) {
new JerseyClientGet().go();
}
public void go() {
Client client = Client.create();
// /sayHelloByGET为某精确函数的@path
WebResource webResource = client.resource(url+"/sayHelloByGET");
// 设定要帶的参数
MultivaluedMap queryParams = new MultivaluedMapImpl();
queryParams.add("from", "3"); //from是个key,服务端要根据"from"获得"3",类似map
//调用@GET服务时使用如下方法
String str = webResource.queryParams(queryParams).get(String.class);
System.out.println(str);
}
}
如果调用服务端的函数是@GET,则要用上述红颜色的.get方法
2 @POST
2.1服务端
package com.cn;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
@Path("/HelloWorldRS") // 本服务的访问路径,与工程路径组合使用
public class HelloWorldRS {
Map<String,String> map = new HashMap<String,String>();
public HelloWorldRS() {
map.put("1","A");
map.put("2","B");
map.put("3","C");
}
@POST表明是一个POST方法
@Path("/sayHelloByPOST")调用的时候要加入此路径,精确指定调用的函数
@Produces("text/html") // 输出参数的类型
public String sayHelloByPOST (
@QueryParam("from")String fromValue, //客户端post传来的参数key为"from"
@Context HttpServletRequest request) {
System.out.println(fromValue);
return map.get(fromValue);
}
2.2调用2.1post服务的客户端
package com.client;
import javax.ws.rs.core.*;
import com.sun.jersey.api.client.*;
import com.sun.jersey.core.util.*;
public class JerseyClientGet {
//基础的服务url+服务类的@path
private String url = "http://localhost:8080/RestfulDemo/HelloWorldRS";
public static void main(String[] args) {
new JerseyClientGet().go();
}
public void go() {
Client client = Client.create();
//POST
WebResource webResource = client.resource(url+"/sayHelloByPOST");
MultivaluedMap queryParams = new MultivaluedMapImpl();
queryParams.add("from", "2");
String resp = webResource.queryParams(queryParams)
.post(String.class, queryParams);
System.out.println(resp);
}
}
3 @DELETE
3.1服务端
package com.cn;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
@Path("/HelloWorldRS") // 本服务的访问路径,与工程路径组合使用
public class HelloWorldRS {
Map<String,String> map = new HashMap<String,String>();
public HelloWorldRS() {
map.put("1","A");
map.put("2","B");
map.put("3","C");
}
@DELETE表明是一个delete方法
@Path("/delSomePor")调用的时候要加入此路径,精确指定调用的函数
@Produces("text/html") // 输出参数的类型
public String delSomePor (
@QueryParam("from")String fromValue, //客户端delete传来的参数key为"from"
@Context HttpServletRequest request) {
System.out.println(fromValue);
map.remove(fromValue);
return String.valueOf(map.size());
}
3.2调用3.1delete服务的客户端
package com.client;
import javax.ws.rs.core.*;
import com.sun.jersey.api.client.*;
import com.sun.jersey.core.util.*;
public class JerseyClientGet {
//基础的服务url+服务类的@path
private String url = "http://localhost:8080/RestfulDemo/HelloWorldRS";
public static void main(String[] args) {
new JerseyClientGet().go();
}
public void go() {
Client client = Client.create();
//DELETE
WebResource webResource = client.resource(url+"/delSomePor");
MultivaluedMap queryParams = new MultivaluedMapImpl();
queryParams.add("from", "2");
String str = webResource.queryParams(queryParams).delete((String.class));
System.out.println(str);
}
}