HttpClient實現遠端呼叫
阿新 • • 發佈:2020-12-25
技術標籤:系統架構HttpClient遠端呼叫
客戶端網路框架-HttpClient實現遠端呼叫
apache common封裝好的HttpClient
org.apache.commons.httpclient
HttpClient:程式碼複雜,還得操心資源回收等。程式碼很複雜,冗餘程式碼多。
目錄
一、HttpClient介紹
HTTP 協議可能是現在 Internet 上使用得最多、最重要的協議了,越來越多的 Java 應用程式需要直接通過 HTTP 協議來訪問網路資源。雖然在 JDK 的 java net包中已經提供了訪問 HTTP 協議的基本功能,但是對於大部分應用程式來說,JDK 庫本身提供的功能還不夠豐富和靈活。HttpClient 是 Apache Jakarta Common 下的子專案,用來提供高效的、最新的、功能豐富的支援 HTTP 協議的客戶端程式設計工具包,並且它支援 HTTP 協議最新的版本和建議。
Commons的HttpClient專案現在是生命的盡頭,不再被開發, 已被ApacheHttpComponents專案HttpClient和HttpCore 模組取代,提供更好的效能和更大的靈活性。
二、工具類
package com.cnzz.demo.remote.rpc; import com.alibaba.fastjson.JSONObject; import org.apache.commons.httpclient.*; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.params.HttpMethodParams; import java.io.IOException; /** * ************************************************************ * Copyright © 2020 cnzz Inc.All rights reserved. * ** * ************************************************************ * * @program: demo * @description: * @author: cnzz * @create: 2020-12-23 17:41 **/ public class HttpClientUtil { /** * httpClient的get請求方式 * 使用GetMethod來訪問一個URL對應的網頁實現步驟: * 1.生成一個HttpClient物件並設定相應的引數; * 2.生成一個GetMethod物件並設定響應的引數; * 3.用HttpClient生成的物件來執行GetMethod生成的Get方法; * 4.處理響應狀態碼; * 5.若響應正常,處理HTTP響應內容; * 6.釋放連線。 * @param url * @param charset * @return */ public static String doGet(String url, String charset) { //1.生成HttpClient物件並設定引數 HttpClient httpClient = new HttpClient(); //設定Http連線超時為5秒 httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000); //2.生成GetMethod物件並設定引數 GetMethod getMethod = new GetMethod(url); //設定get請求超時為5秒 getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000); //設定請求重試處理,用的是預設的重試處理:請求三次 getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler()); String response = ""; //3.執行HTTP GET 請求 try { int statusCode = httpClient.executeMethod(getMethod); //4.判斷訪問的狀態碼 if (statusCode != HttpStatus.SC_OK) { System.err.println("請求出錯:" + getMethod.getStatusLine()); } //5.處理HTTP響應內容 //HTTP響應頭部資訊,這裡簡單列印 Header[] headers = getMethod.getResponseHeaders(); for(Header h : headers) { System.out.println(h.getName() + "---------------" + h.getValue()); } //讀取HTTP響應內容,這裡簡單列印網頁內容 //讀取為位元組陣列 byte[] responseBody = getMethod.getResponseBody(); response = new String(responseBody, charset); System.out.println("-----------response:" + response); //讀取為InputStream,在網頁內容資料量大時候推薦使用 //InputStream response = getMethod.getResponseBodyAsStream(); } catch (HttpException e) { //發生致命的異常,可能是協議不對或者返回的內容有問題 System.out.println("請檢查輸入的URL!"); e.printStackTrace(); } catch (IOException e) { //發生網路異常 System.out.println("發生網路異常!"); } finally { //6.釋放連線 getMethod.releaseConnection(); } return response; } /** * post請求 * @param url * @param json * @return */ public static String doPost(String url, JSONObject json){ HttpClient httpClient = new HttpClient(); PostMethod postMethod = new PostMethod(url); postMethod.addRequestHeader("accept", "*/*"); postMethod.addRequestHeader("connection", "Keep-Alive"); //設定json格式傳送 postMethod.addRequestHeader("Content-Type", "application/json;charset=GBK"); //必須設定下面這個Header postMethod.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36"); //新增請求引數 postMethod.addParameter("commentId", json.getString("commentId")); String res = ""; try { int code = httpClient.executeMethod(postMethod); if (code == 200){ res = postMethod.getResponseBodyAsString(); System.out.println(res); } } catch (IOException e) { e.printStackTrace(); } return res; } public static void main(String[] args) { System.out.println(doGet("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=telPhone", "GBK")); System.out.println("-----------分割線------------"); System.out.println("-----------分割線------------"); System.out.println("-----------分割線------------"); JSONObject jsonObject = new JSONObject(); jsonObject.put("commentId", "telPhone"); System.out.println(doPost("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071", jsonObject)); } }
參考
java實現呼叫http請求的幾種常見方式
https://blog.csdn.net/riemann_/article/details/90539829