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/A1000037B04B8C100 * @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 }
新聞熱點
疑難解答