REST(Representational State Transfer)是基于 SOAP 和 Web 服务描述语言的 Web 服务的更为简单的替代方法。REST 对 Web 的影响非常大,由于其使用相当方便,已经普遍地取代了基于 SOAP 和 WSDL 的接口设计。
我们这里是基于jersey来在java中实现webService服务。
Jersey是JAX-RS 的参考实现。Jersey:https://jersey.dev.java.net/
JAX -RS 为在Java上构建RESTful风格的web services提供了一组标准API。这组API基本上由一组注解(annotations)和相关的类和接口组成的。我们可以通过为 POJO 添加注解来发布 web services。
一.将jersey相关的jar包拷贝到java web项目的lib目录。
asm-3.1.jar
jackson-core-asl-1.8.3.jar
jackson-jaxrs-1.8.3.jar
jackson-mapper-asl-1.8.3.jar
jackson-xc-1.8.3.jar
jersey-client-1.10.jar
jersey-core-1.10.jar
jersey-json-1.10.jar
jersey-server-1.10.jar
jersey-servlet-1.10.jar
jettison-1.1.jar
jsr311-api-1.1.1.jar
jackson-core-asl-1.8.3.jar
jackson-jaxrs-1.8.3.jar
jackson-mapper-asl-1.8.3.jar
jackson-xc-1.8.3.jar
jersey-client-1.10.jar
jersey-core-1.10.jar
jersey-json-1.10.jar
jersey-server-1.10.jar
jersey-servlet-1.10.jar
jettison-1.1.jar
jsr311-api-1.1.1.jar
最简包:jersey-core-1.10.jar , jersey-server-1.10.jar, asm-3.1.jar, jsr311-api-1.1.1.jar
二.配置web.xml
<!-- REST Service 提供 web service服务 --> <servlet> <servlet-name>JAX-RS REST Servlet</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <load-on-startup>4</load-on-startup> </servlet> <servlet-mapping> <servlet-name>JAX-RS REST Servlet</servlet-name> <!-- 指定了services路径下的所有都将被jersey进行拦截 --> <url-pattern>/services/*</url-pattern> </servlet-mapping>
三.建立service端Java类。使用注解将其暴露为web服务对象。
package com.XXXXXXXXXXXXX;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
import org.apache.log4j.Logger;
import com.txsoft.xmcp.operation.common.util.CommonUtils;
/**
* History Resource
*
* @author jiangbo
*
*/
@Path("/xmcp/test")
public class WebServiceResource {
/**
* lo4j
*/
private static Logger logger = Logger.getLogger(WebServiceResource.class);
/**
* main
*
* @param json
* @param method
* @return
*/
@Path("/{method}")
@POST
@Consumes( {
"application/json", "application/xml" })
@Produces( {
"application/json", "application/xml" })
public JSONObject main(JSONObject json, @PathParam("method")
String method) {
logger.debug("===============interface input param JSON data:" + json);
JSONObject rejson = new JSONObject();
// 初始化内存中的热力站数据
rejson = initStationInfo(json, method);
logger.debug("===============interface return JSON data:" + rejson);
return rejson;
}
}
四.新建客户端类。实现对服务端的调用。
1.使用Jersey Client 与 REST 服务通讯
客户端调用服务端时候可以通过post方式或者get方式分别调用。可以传参数,也可以无参数。
这里给一个 post的 带参数的例子
package com.txsoft.xmcp.operation.resource;
import java.net.URI;
import java.net.URISyntaxException;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
/**
*
* @author JiangBo
*/
public class webServiceClient {
public static void main(String[] args) throws URISyntaxException {
Client client = Client.create();
URI u = new URI("http://localhost:8888/XMCP/services/xmcp/initStationInfo");
// 客户端的核心类是 WebResource。据根 URI 构建一个请求 URL。发送请求并获取响应。
WebResource resource = client.resource(u);
// 以post的方式进行通讯
// POST 请求 :一个 POST 请求相当于一个 GET 请求和一个 PUT 请求的综合
// 使用 POST 请求来发送一个实体到指定的 Web 资源并且接收另一个实体。使用 WebResource 类的 post() 方法来发送一个 HTTP POST 请求到指定的 Web 资源。
// 发送一个带有查询参数以及进行了 URL 编码的表单数据的 POST 请求
String jsonObject = resource.type("application/json").post(String.class, "{\"number\":\"aaaaaa\"}");
System.out.println(jsonObject);
}
}