章2、jersey+json搭建服務器以及使用jersey搭建客戶端

仍是老規矩,直接上代碼: 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接口就完成了,你們有什麼問題能夠繼續交流。

相關文章
相關標籤/搜索