2.web.xml配置,其中com.thinknet.restful就是你的需要加载发布的REST服务包名,如果你在不同的包下面存放了rest服务类,那你就需要在【<param-value>】配置中以逗号分开你需要加载的包,如下所示:
<servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class> com.sun.jersey.spi.container.servlet.ServletContainer </servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>com.thinknet.restful,com.thinknet.restful1</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping>
3.java代码,这里我举出了三个GET、POST、PUT服务方法,还有DELETE服务方法没写,如果你有兴趣可以做得更好。
package com.thinknet.restful; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import net.sf.json.JSONObject; @Path(value = "/thinknet") public class CardUnifiedCheck { @GET @Path("/getSayHello") @Produces(MediaType.TEXT_PLAIN) public String sayhello() { return "get hello jersey."; } @POST @Path("/postSayHello") public String sayhelloPost(String data) { JSONObject jo = JSONObject.fromObject(data); return jo.getString("name") + " post say hello."; } @PUT @Path("/putSayHello") public String sayHelloPut(@QueryParam("name") String name) { return name + " put say hello."; } }
4.如果你把上面所说的都做好了,rest服务就只需要发布就可以了,我是用tomcat发布的。
5.在浏览器中输入:http://localhost:8080/tnwebserver/rest/thinknet/getSayHello就会响应get hello jersey.
6.但是如果我访问POST、PUT等服务呢?可能浏览器中可以请求这些服务,我用浏览器请求带参的POST服务没有通过,报405的错误,我想是需要一点特殊方法才行,但我们没必须要去研究用浏览器访问,下面分别说说CXF模拟客户端与Jquery中的AJAX模拟客户端请求。
CXF代码【PUT请求】:
ClientResource clientR = new ClientResource("http://localhost:8080/tnwebserver/rest/thinknet/putSayHello"); clientR.addQueryParameter("name", "无敌浩克"); Representation result = clientR.put(""); result.setCharacterSet(CharacterSet.UTF_8); System.out.println(new String(result.getText()));
CXF代码【POST请求】:
ClientResource clientR = new ClientResource("http://localhost:8080/tnwebserver/rest/thinknet/postSayHello"); // clientR.addQueryParameter("name", "无敌浩克"); JSONObject jo = new JSONObject(); jo.put("name", "无敌浩克"); Representation result = clientR.post(jo.toString()); result.setCharacterSet(CharacterSet.UTF_8); System.out.println(new String(result.getText()));
如果你对CXF客户端访问rest服务感兴趣,请下载jar包:cxf-2.6.13.jar
JQuery Ajax请求rest服务:
$(function(){ // GET按钮请求 $("#getBtn").click(function(){ var requestURL = "/tnwebserver/rest/thinknet/getSayHello"; $.ajax({ type : "GET", url : requestURL, async : false, cache : false, success : function(resultData, textStatus) { $("#getText").val(resultData); } }); }); // POST按钮请求 $("#postBtn").click(function(){ var paramter = {}; paramter= "{'name':'"+$("#postParamVal").val()+"'}"; var requestURL = "/tnwebserver/rest/thinknet/postSayHello"; $.ajax({ type : "POST", url : requestURL, async : false, data : paramter, cache : false, contentType: "application/json;charset=utf-8", success : function(resultData, textStatus) { $("#postText").val(resultData); } }); }); // PUT按钮请求 $("#putBtn").click(function(){ var paramter = {}; paramter= "{'name':'"+$("#putParamVal").val()+"'}"; var requestURL = "/tnwebserver/rest/thinknet/putSayHello"; $.ajax({ type : "PUT", url : requestURL, async : false, data : paramter, cache : false, contentType: "application/json;charset=utf-8", success : function(resultData, textStatus) { $("#putText").val(resultData); } }); }); });
以上GET与POST的请求都是正常的,但是这里的PUT就出现了问题,我们传递过去的参数变成了null(仔细看PUT服务方法中参数加了一个注解@QueryParam),是服务端没有接收到,但CXF访问PUT服务没问题,其实是我们JS代码没有设置好所导致的,我找了很久也没能找到解决方案,只要加了注解@QueryParam的服务,Jquery Ajax中的参数服务端就无法接收,这个问题我想把交给你们解决,如果你们感兴趣的话。