2021-05-12 14:32:11
httpClient使用總結
目前C/S還是B/S結構的應用程式, HTTP 應該是最為廣泛使用的協定了。在 Java 平台上,Java 標準庫提供了 一個HttpURLConnection 類來支援 HTTP 通訊。不過 HttpURLConnection 本身的 API 不夠友好,所提供的功能也有限。httpClien是一個實現http協定很多操作功能的元件,並且它支援 HTTP 協定最新的版本和建議,現在Android已經成功的整合了HttpClient。另外,最新由Square 公司開源的 OkHttp 據說能提供更高效率的http連線,支援GZIP 壓縮和 HTTP 響應快取功能,在原理上應該是大同小異的。
再說httpclient ,那也是眼花繚亂。隨便一搜,比如有些博文使用了 org.apache.commons.httpclient.HttpClient ,有些博文用org.apache.http.client.HttpClient 類。原來,httpclient本來是屬於apache-commons 專案下的一個子專案,後來是由Apache HttpComponents專案開發了後面的版本以提供更好的效能和更大的靈活性。commons下的這個httpclient最高版本是目前的3.1,支援HTTP協定1.1,繼承了java.net.urlConnection,已經足夠提供目前測試的大部分rest服務介面,本文介紹一下用法。這裡可以檢視所有的API - http://hc.apache.org/httpclient-3.x/apidocs/overview-summary.html
在金融產品的測試過程中,我曾經碰到的服務介面有區分,比如與合作方互動一般是傳xml較多,單應用的後台一般是http rest服務。這裡提供一個傳json的例子。
public void urlPostJson(String url,String desc,String json) {
log.info("-----------------------------"+desc+" Request: " + json);
HttpClient client = new HttpClient();
client.getHostConfiguration().setProxy("127.0.0.1", 5689);
client.getHttpConnectionManager().getParams().setConnectionTimeout(3000);// client.setConnectionTimeout(3000);
client.getParams().setSoTimeout(3000);// client.setTimeout(1000);
client.getParams().setConnectionManagerTimeout(1000);
PostMethod method = new PostMethod(url);
try {
// method.setRequestHeader("Content-Type", " application/json; charset=UTF-8");
method.setRequestBody(new ByteArrayInputStream(json.getBytes("UTF-8")));
// method.setRequestBody(json);
int status = client.executeMethod(method);
String res=method.getResponseBodyAsString();
log.info(" status:"+status+" Resonse: "+res);
} catch (IOException e) {
log.error("HttpClient.executeMethod(postMethod) IOException!",e);
}finally{
if (method != null) {
method.releaseConnection();
}
}
}
如上,利用httpclient去存取介面的步驟一般是:
1. 建立HttpClient物件。2. 構造Http 請求物件。3. 執行HttpClient物件的execute方法,將Http請求物件作為該方法的引數。4. 讀取execute方法返回的HttpResponse結果並解析。5、釋放連線。整個過程是不是與我們平時在瀏覽器上存取類似呢。唯一區別是不能執行HTTP頁面中簽入嵌入的JS程式碼,自然也不會對頁面內容進行任何解析、處理,這些都是需要開發人員來完成的。在以上程式碼中,httpclient的初始化沒有看到任何引數設定,其實是在它的建構函式裡呼叫了介面,並設定了預設值,如下包含協定版本、用戶端引擎、cookie策略等,如果要自己設定,可以通過它的成員變數httpClientParams物件進行設定。
1、關於重定向。
http多種狀態已經在HttpStatus這個類中定義好,其中重定向 根據RFC2616中對自動轉向的定義,主要有兩種:301和302。301表示永久的移走(Moved Permanently),當返回的是301,則表示請求的資源已經被移到一個固定的新地方,任何向該地址發起請求都會被轉到新的地址上。302表示暫時的轉向,比如在伺服器端的servlet程式呼叫了sendRedirect方法,則在用戶端就會得到一個302的程式碼,這時伺服器返回的頭資訊中location的值就是sendRedirect轉向的目標地址。如果是get方式請求,httpclient是自動幫你重定向並拿到響應資訊,也可以通過設定method.setFollowRedirects(false)不自動轉。post的請求是不能自動跳轉的,需要從頭部資訊中拿到Location(可能是相對路徑)因此需要對location返回的值做一些處理才可以發起向新地址的請求。
2、字元編碼
用戶端傳送的資料多樣,最終所有資料都是通過最底層的物理層面的電信號來傳遞,首部欄位content-type 說明了實體主體內物件的媒體型別,即伺服器通過contentType來知道這個是什麼樣子的資料。用戶端在拿到伺服器返回的資料後,根據頭部設定的可接收媒體型別進行內容協商,返回最適合的資源。對於有中文的請求,為避免出現亂碼,最好設定content-type。在上部分的程式碼截圖,大家可以看到,如果我們自己不設定contentType 那麼預設會採用ISO的方式進行傳輸,那麼如果與你實際的編碼方式不一致的話,伺服器就會拿到一個亂碼,從而無法正常的響應。可以通過上面程式碼進行設定,也可以通過method.setRequestHeader("Content-Type", " application/json; charset=UTF-8")來進行設定
3、cookie
httpclient預設的cookie策略是RFC_2109其中可以通過去更改。請求過程中可以通過sendHead 把cookie放入頭部,並傳到後端進行存取。
總結:
基本上使用httpclient過程中,主要操作的類有:httpclient,getMethod,postMethod,httpClientParams,httpConnectionManager這幾個。詳見以下的類圖。
HttpClient代表了一個http的用戶端,HttpConnectionManager是用來管理HttpConnection 的,HttpConnection代表了一個http連線,所以HttpConnectionManager其實質上也就是一個http連線池,管理這些 http連線(和資料庫連線池一個道理)。HttpMethod代表了一個Http方法,一個HttpClient可以執行多個HttpMethod(實 質上,httpclient執行一個HttpMethod時,會從connectionmanager那裡獲取一個httpconnection,在此 connection上執行該method,執行完該method後,讓method 釋放該httpconnection,從而將該httpconnection返回給connectionmanager,以便供後續的method使 用)所以在httpclient連線後資源釋放問題很重要,就跟我們用database connection要釋放資源一樣。
4、小tips
1、fidder作為一款強大好用的web偵錯利器,針對commons下的httpclient可以如下設定代理,能幫你記錄下請求和響應的所有資訊。 介面測試中遇到異常方便檢視,減少自己debug的情況。
5、擴充套件
httpclient功能之強大,不是一篇文章能夠說完。其他的,例如檔案上傳、DNS設定、多執行緒下的httpclient使用。過程中需要你對http協定、cookie-session機制有一定的認識基礎。本篇檔案旨在用做一些簡單介面的測試,目前commons這個版本已經不做更新了,如果有更複雜的介面,還是推薦使用org.apache.http.impl.client下的httpclient。
Java語言使用HttpClient模擬瀏覽器登入 http://www.linuxidc.com/Linux/2016-05/131214.htm
HttpClient4.3 關於https 中SSL證書請求問題 http://www.linuxidc.com/Linux/2016-04/130090.htm
HttpClient4 用法 由HttpClient3 升級到 HttpClient4 必看 http://www.linuxidc.com/Linux/2015-06/119100.htm
HttpClient 教學 http://www.linuxidc.com/Linux/2015-06/119099.htm
使用HttpClient實現檔案的上傳下載 http://www.linuxidc.com/Linux/2014-07/104303.htm
Android 實現 HttpClient 請求Https http://www.linuxidc.com/Linux/2014-05/102306.htm
Android使用HttpClient下載圖片 http://www.linuxidc.com/Linux/2014-05/101855.htm
HttpClient使用詳解 http://www.linuxidc.com/Linux/2014-08/104945.htm
本文永久更新連結地址:http://www.linuxidc.com/Linux/2016-11/137590.htm
相關文章