Jersey客戶端API調用REST風格的Web服務


Jersey 客戶端 API 基礎

 jersey-1.14.jar 密碼: cxug 

要開始使用 Jersey 客戶端 API,你首先需要創建一個 com.sun.jersey .api.client.Client 類的實例。下面是最簡單的方法:

import com.sun.jersey .api.client.Client;
Client client = Client.create();

Client 類是創建一個 RESTful Web Service 客戶端的主要配置點。你可以使用它來配置不同的客戶端屬性和功能,並且指出使用哪個資源提供者。創建一個 Client 類的實例是一個比較昂貴的操作,所以盡量避免創建一些不需要的客戶端實例。比較好的方式是盡可能地復用已經存在的實例。

    當你創建完一個 Client 類的實例后,你可以開始使用它。無論如何,在發出請求前,你需要創建一個 Web Resource 對象來封裝客戶端所需要的 Web 資源。

Web 資源創建了一個 WebResponse 對象:

import com.sun.jersey .api.client.WebResource;
Web Resource webResource = c.resource("http://example.com/base");

通過使用 WebResource 對象來創建要發送到 Web 資源的請求,以及處理從 Web 資源返回的響應。例如,你可以使用 WebResource 對象來發送 HTTP GET、PUT、POST 以及 DELETE 請求。

    GET 請求:使用 WebResource 類的 get() 方法來提交一個 HTTP GET請求到 Web 資源:

String s = webResource.get(String.class);
    這表示如果 WebResource 對象的 URL 是 http://example.com/base,那么一個 HTTP GET 請求將會發送到地址為 http://example.com/base 的資源。

String s = webResource.get(String.class);
   你還可以指定 get() 請求時的查詢參數。例如,下面的代碼在 get() 請求中指定了兩個查詢參數:

MultivaluedMap queryParams = new MultivaluedMapImpl();
queryParams.add("param1", "val1");
queryParams.add("param2", "val2");
String s = webResouce.queryParams(queryParams).get(String.class);

  你還可以指定響應所能接受的 MIME 類型。例如,下面的代碼指定了響應的 MIME 類型只能為文本:

String s = webResource.accept("text/plain").get(String.class);

你還可以獲取對應請求的 HTTP 狀態碼,例如下面這個例子展示獲取一個請求所返回的文本實體與狀態碼:   

ClientResponse response = webResource.accept("text/plain")
                                    .get(ClientResponse.class);
int status = response.getStatus();
String textEntity = response.getEntity(String.class); 

ClientResponse 對象代表了一個客戶端收到的 HTTP 響應。   

PUT 請求 :使用 WebResource 類的 put() 方法來提交一個 HTTP PUT 請求到 Web 資源。例如下面的代碼展示了請求發送一個文本實體 foo:bar 到指定的 Web 資源:

ClientResponse response = webResource.type("text/plain")
                                    .put(ClientResponse.class, "foo:bar");    

同樣,你也可以在使用 put() 方法發送請求時指定查詢參數,方法與使用 get() 方法時指定查詢參數一樣。在下面的例子中,把在之前 get() 方法示例中使用過的兩個同樣的查詢參數指定到了一個 put() 請求中:

MultivaluedMap queryParams = new MultivaluedMapImpl();
queryParams.add("param1", "val1");
queryParams.add("param2", "val2");
ClientResponse response = webResource.queryParams(queryParams)
                                    .put(ClientResponse.class, "foo:bar");

 POST 請求 :一個 POST 請求相當於一個 GET 請求和一個 PUT 請求的綜合,也就意味着,你可以使用 POST 請求來發送一個實體到指定的 Web 資源並且接收另一個實體。使用 WebResource 類的 post() 方法來發送一個 HTTP POST 請求到指定的 Web 資源。下面的例子展示了發送一個帶有查詢參數以及進行了 URL 編碼的表單數據的 POST 請求:

MultivaluedMap formData = new MultivaluedMapImpl();
formData.add("name1", "val1");
formData.add("name2", "val2");
ClientResponse response = webResource.type("application/x-www-form-urlencoded")
                                    .post(ClientResponse.class, formData);

 DELETE 請求:使用 Web Resource 類的 delete() 方法來發送珍上 HTTP DELETE 請求到指定的 Web 資源。例如,下面的例子展示刪除一個 URI 為 http://example.com/base/user/123 資源:

ClientResponse response = webResource.path("user/123")
                                    .delete(ClientResponse.class);

  另外,Web Resource.path() 方法可以在所有 HTTP 請求中使用,它可以讓你給要請求的 Web 資源指定一個額外的路徑。另一個 WebResouce 類的方法 header() 可以給你的請求添加 HTTP 頭部信息。

另外如果表單提交的話,需要new Form來作為參數提交。

一個基於 Jersey 客戶端的示例

 

  1 import com.alibaba.fastjson.JSON;
  2 import com.alibaba.fastjson.JSONArray;
  3 import com.alibaba.fastjson.JSONObject;
  4 import com.rimi.medical.common.domain.ResultPojo;
  5 import com.sun.jersey.api.client.Client;
  6 import com.sun.jersey.api.client.ClientResponse;
  7 import com.sun.jersey.api.client.WebResource;
  8 import com.sun.jersey.core.util.MultivaluedMapImpl;
  9 
 10 import javax.ws.rs.core.MediaType;
 11 import javax.ws.rs.core.MultivaluedMap;
 12 import java.util.ArrayList;
 13 import java.util.Iterator;
 14 import java.util.List;
 15 import java.util.Map;
 16 
 17 /**
 18  * JerseyAPi客戶端
 19  * Created by libt on 2015/01/30.
 20  */
 21 public class JerseyClientUtil {
 22 
 23     private static final String BIGDATA_API_URL = ReadSettingProperties.getValue("bigdata_api_url");
 24 
 25     /**
 26      * post方法
 27      *
 28      * @param method 方法名
 29      * @param param  參數
 30      * @return 返回值
 31      */
 32     public static ResultPojo postMethod(String method, String param) {
 33         ResultPojo resultPojo = new ResultPojo();
 34         ClientResponse response = null;
 35         try {
 36             Client client = Client.create();
 37             WebResource resource = client.resource(BIGDATA_API_URL + method);
 38             response = resource.type(MediaType.APPLICATION_JSON_TYPE).post(ClientResponse.class, param);
 39             int status = response.getStatus();
 40             String data = response.getEntity(String.class);
 41             if (status == 200) {
 42                 JSONObject jsonObject = JSON.parseObject(data);
 43                 resultPojo.setStatus(jsonObject.getInteger("status"));
 44                 resultPojo.setData(data);
 45             } else {
 46                 resultPojo.setStatus(response.getStatus());
 47                 resultPojo.setData(data);
 48             }
 49         } catch (Exception e) {
 50             resultPojo.setStatus(500);//服務器異常
 51             resultPojo.setErrorMsg(e.getMessage());
 52         } finally {
 53             if (response != null) {
 54                 response.close();
 55             }
 56         }
 57         return resultPojo;
 58     }
 59 
 60 
 61     /**
 62      * get方法
 63      * 例如:consultation/recommend?startDate=201412030253&endDate=201412020253
 64      * @param method 方法名
 65      * @param param  參數
 66      * @return 返回值
 67      */
 68     public static ResultPojo getMethod(String method, String param) {
 69         ResultPojo resultPojo = new ResultPojo();
 70         ClientResponse response = null;
 71         try {
 72             Client client = Client.create();
 73             WebResource resource = client.resource(BIGDATA_API_URL + method);
 74             response = resource.queryParams(parseJSON2Map(param)).accept(MediaType.APPLICATION_JSON_TYPE).get(ClientResponse.class);
 75             int status = response.getStatus();
 76             String data = response.getEntity(String.class);
 77             if (status == 200) {
 78                 JSONObject jsonObject = JSON.parseObject(data);
 79                 resultPojo.setStatus(jsonObject.getInteger("status"));
 80                 resultPojo.setData(data);
 81             } else {
 82                 resultPojo.setStatus(response.getStatus());
 83                 resultPojo.setData(response.getEntity(String.class));
 84             }
 85         } catch (Exception e) {
 86             e.printStackTrace();
 87             resultPojo.setStatus(500);//服務器異常
 88             resultPojo.setErrorMsg(e.getMessage());
 89         } finally {
 90             if (response != null) {
 91                 response.close();
 92             }
 93         }
 94         return resultPojo;
 95     }
 96 
 97     /**
 98      * get方法
 99      * 例如:consultation/recommend/A1000037B04B8C
100      * @param method 方法名
101      * @param param  參數
102      * @return 返回值
103      */
104     public static ResultPojo getMethodOnly(String method, String param) {
105         ResultPojo resultPojo = new ResultPojo();
106         ClientResponse response = null;
107         try {
108             Client client = Client.create();
109             WebResource resource = client.resource(BIGDATA_API_URL + method + param);
110             response = resource.accept(MediaType.APPLICATION_JSON_TYPE).get(ClientResponse.class);
111             int status = response.getStatus();
112             String data = response.getEntity(String.class);
113             if (status == 200) {
114                 JSONObject jsonObject = JSON.parseObject(data);
115                 resultPojo.setStatus(jsonObject.getInteger("status"));
116                 resultPojo.setData(data);
117             } else {
118                 resultPojo.setStatus(response.getStatus());
119                 resultPojo.setData(response.getEntity(String.class));
120             }
121         } catch (Exception e) {
122             e.printStackTrace();
123             resultPojo.setStatus(500);//服務器異常
124             resultPojo.setErrorMsg(e.getMessage());
125         } finally {
126             if (response != null) {
127                 response.close();
128             }
129         }
130         return resultPojo;
131     }
132 
133     public static MultivaluedMap parseJSON2Map(String jsonStr) {
134         MultivaluedMap queryParams = new MultivaluedMapImpl();
135         //最外層解析
136         JSONObject json = JSON.parseObject(jsonStr);
137         for (Map.Entry<String, Object> entry : json.entrySet()) {
138             Object v = entry.getValue();
139             //如果內層還是數組的話,繼續解析
140             if (v instanceof JSONArray) {
141                 List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
142                 Iterator<Object> it = ((JSONArray) v).iterator();
143                 while (it.hasNext()) {
144                     JSONObject json2 = (JSONObject) it.next();
145                     list.add(parseJSON2Map(json2.toJSONString()));
146                 }
147                 queryParams.add(entry.getKey(), list);
148             } else {
149                 queryParams.add(entry.getKey(), v);
150             }
151         }
167         return queryParams;
168     }
169 
170 
171     public static void main(String[] args) {
172 
173 //        ResultPojo resultPojo = postMethod("bfr/bfr_choices", "{\"userid\":\"00004\",\"createTime\":\"2014-09-23 16:19:23\",\"bmiScore\":\"80\",\"imageNum\":\"01\",\"type\":\"0\",\" info \":\"個人身體質量分析正常\"}");
174         ResultPojo resultPojo = getMethod("recommendInfo/query", "{\"endDate\":\"201412020253\",\"startDate\":\"201410010253\"}");
175 //        ResultPojo resultPojo = getMethodOnly("consultation/recommend/", "A1000037B04B8C");
176         System.out.println(resultPojo.getStatus());
177         System.out.println(resultPojo.getErrorMsg());
178 
179     }
180 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM