仍是老規矩,直接上代碼: java
一、服務器 web
1.1 服務器所需JAR包: spring
上圖中紅色框中的三個JAR包是搭建jersey+json REST服務器的核心包,其中genson-1.3.jar比較重要,是對JSON數據處理的重要JAR包。另外json-lib-2.4-jdk15是第三方處理JSON數據的JAR包,博主在其餘地方也喜歡用這個包來處理JSON數據,很方便。 json
maven依賴: api
<!-- jersey服務器端須要的包 --> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-bundle</artifactId> <version>1.18.1</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-json</artifactId> <version>1.18.1</version> </dependency> <!-- genson用於幫助服務器處理JSON數據的重要JAR包 --> <dependency> <groupId>com.owlike</groupId> <artifactId>genson</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <classifier>jdk15</classifier> <version>2.4</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency>
補充(2016-1-12 14:36:32):若是但願Jersey對JSON支持,須要添加依賴 服務器
<dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-json</artifactId> <version>1.18</version> </dependency>
而後就能夠在在接受返回的entity的時候,直接傳遞對象,jersey自動會幫咱們完成json to model的工做 restful
ClientResponse response = resource .accept(MediaType.APPLICATION_JSON) .type(MediaType.APPLICATION_JSON) .post(ClientResponse.class, req); MyResultModel resp = response.getEntity(MyResultModel.class);
1.2 編寫服務器代碼 app
web.xml配置(章一中已經提到,這裏再貼一次): maven
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance http://www.springmodules.org/schema/cache/springmodules-cache.xsd http://www.springmodules.org/schema/cache/springmodules-ehcache.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd "> <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class> com.sun.jersey.spi.container.servlet.ServletContainer </servlet-class> <init-param> <!-- 包含資源的 Java 包,資源類是一個簡單的 Java 對象 (POJO),能夠實現任何接口 --> <param-name> com.sun.jersey.config.property.packages </param-name> <param-value>com.rest.server.controller</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> </web-app>Controller中的代碼:
package com.rest.server.controller.json; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import com.rest.server.model.User; /** * JSON數據格式傳遞的demo * @author ll * @version $Id: JSONDemoController.java, v 0.1 Apr 20, 2015 4:25:16 PM ll Exp $ */ @Path("json") public class JSONDemoController { @POST @Path("postJsonData0") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public User postJsonData(User user) { System.out.println("username:" + user.getUsername()); System.out.println("gender:" + user.getGender()); return user; } }
User.java的代碼: post
package com.rest.server.model; import java.io.Serializable; /** * * @author ll * @version $Id: User.java, v 0.1 Apr 20, 2015 5:19:54 PM ll Exp $ */ public class User implements Serializable { /** 序列號 */ private static final long serialVersionUID = 2720630346622952582L; private String username; private String gender; /** * Getter method for property <tt>username</tt>. * * @return property value of username */ public String getUsername() { return username; } /** * Setter method for property <tt>username</tt>. * * @param username value to be assigned to property username */ public void setUsername(String username) { this.username = username; } /** * Getter method for property <tt>gender</tt>. * * @return property value of gender */ public String getGender() { return gender; } /** * Setter method for property <tt>gender</tt>. * * @param gender value to be assigned to property gender */ public void setGender(String gender) { this.gender = gender; } }這樣服務器代碼就編寫完成了,下面只須要啓動服務器,編寫一個客戶端來測試一下
二、客戶端,一樣用jersey來實現客戶端
2.1 客戶端所須要的JAR包
上面圖中有一些其餘包,是博主寫了一些其餘的東西(如MD5加密)等會用到的,你們導入我用紅色框框住的包就能夠了。
這裏給出maven的依賴
<dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.8.0</version> </dependency> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.1</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.1</version> </dependency> <!-- net.sf --> <dependency> <groupId>net.sf.ezmorph</groupId> <artifactId>ezmorph</artifactId> <version>1.0.6</version> </dependency> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <classifier>jdk15</classifier> <version>2.4</version> </dependency> <!-- jersey客戶端須要的包 --> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> <version>1.18.1</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-core</artifactId> <version>1.18.1</version> </dependency>
2.2 編碼
package com.eya.restful.restTest; import java.net.URI; import javax.ws.rs.core.MediaType; import net.sf.json.JSONObject; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; /** * * @author ll Develop on : 2015年4月20日 */ public class RestTest { public static void main(String[] args) { String path = "http://localhost:8090/RestServer/rest/json/postJsonData0"; Client client = null; JSONObject param = new JSONObject(); param.put("username", "Alice"); try { URI uri = new URI(path); client = Client.create(); WebResource webResource = client.resource(uri); ClientResponse response = webResource.type(MediaType.APPLICATION_JSON).post( ClientResponse.class, param.toString()); System.out.println(response.getStatus()); System.out.println("result : " + response.getEntity(String.class)); } catch (Exception e) { e.printStackTrace(); } } }
代碼沒多少註釋,可是比較簡單,你們查查API就能懂了,博主比較忙,不能面面俱到,你們見諒。
2015-12-29 11:09:34 更新
在調用restful接口的時候,不少時候須要添加權限驗證,下面補充進來(核心類是HTTPBasicAuthFilter這個過濾器)
Client client = Client.create(); client.addFilter(new HTTPBasicAuthFilter("username", "password")); WebResource webResource = client.resource("url...");
String url = "http://localhost:8080/pentaho"; final ClientConfig config = new DefaultClientConfig(); config.getProperties().put( ClientConfig.PROPERTY_FOLLOW_REDIRECTS, true ); Client client = Client.create( config ); client.addFilter( new HTTPBasicAuthFilter( "joe", "password" ) ); final WebResource resource = client.resource( url + "/api/repo/files/children?depth=-1&filter=*" );
2.3 運行客戶端
服務器控制檯顯示:
客戶端控制檯顯示:
好了,到這裏一個簡單的使用json數據的REST接口就完成了,你們有什麼問題能夠繼續交流。