Java中關於httpClient的用法總結
httpClient是apache開發的一個用於http傳輸的工具包,用起來非常方便,封裝了底層協議,提供了一些簡單可用的api以供調用。
快速開始:
-
創建一個http客戶端:
private static CloseableHttpClient client = HttpClients.createDefault();
-
創建一個httpPost用於模擬http的post請求:
HttpPost httpPost = new HttpPost("http://localhost:8080/getDetails"); RequestConfig requestConfig = RequestConfig.custom() .setSocketTimeout(1000) .setConnectTimeout(1000) .build(); httpPost.setConfig(requestConfig); httpPost.addHeader("Content-Type", "application/json"); //一個實體類,它從字符串中獲得內容並填充到實體類中,json代表json字符串 StringEntity entity = new StringEntity(json,ContentType.APPLICATION_JSON); httpPost.setEntity(entity);
-
創建一個HttpResponse用來接收響應:
//這裏用CloseableHttpResponse而不用HttpResponse是因爲前者繼承了Closeable接口 //在後面會調用其繼承的close()方法來關閉response CloseableHttpResponse response = null;
-
執行http請求:
response = client.execute(httpPost);
-
獲得響應數據並處理數據:
//獲得響應狀態行 StatusLine statusLine = response.getStatusLine(); if (statusLine != null){ int code = statusLine.getStatusCode(); //請求成功 if(code == 200) { //這裏不用EntityUtils.toString(final HttpEntity entity)方法的原因: //官方api強烈建議禁用此方法:除非entity來自受信任的網站並且實體內容長度有限 //至於爲什麼這樣,本人還沒有研究清楚,可能是EntityUtils.toString方法裏面 //直接利用entity.getContent()方法獲得inputStream,然後將inputStream關閉, //導致如果entity不是repeatable的,則就不能再次訪問entity的內容 // String rev = EntityUtils.toString(response.getEntity()); HttpEntity responseEntity = response.getEntity(); if (responseEntity != null){ //讀取響應內容 String rev = JsonUtil.readToString(responseEntity.getContent(),"utf-8"); //關閉inputStream流 EntityUtils.consume(responseEntity); //將響應轉換成json格式 JSONObject jsonObject = JSON.parseObject(rev); if (jsonObject != null && StringUtils.equals(String.valueOf(jsonObject.get("code")), "200")){ logger.info("【" + systemId + "】" + "系統應答結果:" + String.valueOf(jsonObject.get("msg"))); result = true; }else if (jsonObject != null) logger.error("【" + systemId + "】" + "系統應答結果:" + String.valueOf(jsonObject.get("msg"))); } } }