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 }
