HttpClient 功能介紹 (1)實現了所有 HTTP 的方法(GET,POST,PUT,HEAD 等) (2)支援自動轉向 (3)支援 HTTPS 協議 (4)支援Proxy 伺服器等HttpClient 準系統的使用:共要3個Jar包 commons-codec.jar commons-httpclient.jar commons-logging.jar(1) GET方法 使用 HttpClient 需要以下 6 個步驟:1. 建立 HttpClient 的執行個體 HttpClient httpClient = new HttpClient();GetMethod method =null2. 建立某種串連方法的執行個體。在建構函式中傳入待串連的地址method=new GetMethod(url); 3. 調用HttpClient的 execute 方法來執行GetMethod 執行個體 int retcode = httpClient.executeMethod(method); if (retcode != HttpStatus.SC_OK) {// 發送不成功 facesMessages.add("查詢出錯不成功"); } else {4. 讀 response —— body = method.getResponseBodyAsString();}5. 釋放串連。無論執行方法是否成功,都必須釋放串連if (method != null) { method.releaseConnection(); } 6. 對得到後的內容進行處理備忘:httpClient.getParams().setBooleanParameter("http.protocol.expect-continue", false); method.setRequestHeader("Connection", "close"); //解決Httpclient遠程請求所造成Socket沒有釋放 method=new GetMethod(url); method.addRequestHeader("Accept", "text/plain"); method.addRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");(2)POST方法POST方法用來向目的伺服器發出請求,要求它接受被附在請求後的實體,並把它當作請求隊列(Request-Line)中請求URI所指定資源的附加新子項。POST被設計成用統一的方法實現下列功能: 對現有資源的注釋(Annotation of existing resources) 向電子公告欄、新聞群組,郵件清單或類似討論群組發送訊息 提交資料區塊,如將表單的結果提交給資料處理過程通過附加操作來擴充資料庫1. 建立 HttpClient 的執行個體 HttpClient httpClient = new HttpClient();PostMethod postMethod=null;2. 建立某種串連方法的執行個體。在建構函式中傳入待串連的地址method=new GetMethod(url);填入各個表單域的值NameValuePair[] data = { new NameValuePair("id", "youUserName"), new NameValuePair("passwd", "yourPwd") }; 將表單的值放入postMethod中 postMethod.setRequestBody(data); 3. 調用HttpClient的 execute 方法來執行PostMethod執行個體 int statusCode = httpClient.executeMethod(method); if (statusCode!= HttpStatus.SC_OK) {// 發送不成功 facesMessages.add("查詢出錯不成功"); } else {4. 讀 response —— body = method.getResponseBodyAsString();}5. 釋放串連。無論執行方法是否成功,都必須釋放串連if (method != null) { method.releaseConnection(); } 6. 對得到後的內容進行處理備忘:HttpClient對於要求接受後繼服務的請求,象POST和PUT等不能自動處理轉寄 // 301或者302if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY || statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {// 從頭中取出轉向的地址 Header locationHeader = postMethod.getResponseHeader("location"); String location = null; if (locationHeader != null) { location = locationHeader.getValue(); System.out.println("The page was redirected to:" + location); } else { System.err.println("Location field value is null."); } return;}3使用HttpClient過程中常見的一些問題字元編碼通過method對象的getResponseCharSet()方法就可以得到http頭中的編碼資訊自動轉向根據RFC2616中對自動轉向的定義,主要有兩種:301和302。301表示永久的移走 (Moved Permanently),當返回的是301,則表示請求的資源已經被移到一個固定的新地方,任何向該地址發起請求都會被轉到新的地址上。302表示暫時 的轉向,比如在伺服器端的servlet程式調用了sendRedirect方法,則在用戶端就會得到一個302的代碼,這時伺服器返回的頭資訊中 location的值就是sendRedirect轉向的目標地址。HttpClient支援自動轉向處理,但是象POST和PUT方式這種要求接受後繼服務的請求方式,暫時不支援自動轉向,因此如果碰到POST方式提交 後返回的是301或者302的話需要自己處理。就像剛才在POSTMethod中舉的例子:如果想進入登入BBS後的頁面,必須重新發起登入的請求,請求的地址可以在頭欄位location中得到。不過需要注意的是,有時候location返回的可能是相對路徑,因此需要對location返回的值做一些 處理才可以發起向新地址的請求。 另外除了在頭中包含的資訊可能使頁面發生重新導向外,在頁面中也有可能會發生頁面的重新導向。引起頁面自動轉寄的標籤是:<meta http-equiv="refresh" content="5; url=....">。如果你想在程式中也處理這種情況的話得自己分析頁面來實現轉向。需要注意的是,在上面那個標籤中url的值也可以是一個相對 地址,如果是這樣的話,需要對它做一些處理後才可以轉寄5 處理Proxy 伺服器 HttpClient中使用Proxy 伺服器非常簡單,調用HttpClient中setProxy方法就可以,方法的第一個參數是Proxy 伺服器地址,第二個參數是連接埠號碼。另外HttpClient也支援SOCKS代理。 httpClient.getHostConfiguration().setProxy(hostName,port);擴充閱讀:1.http://hc.apache.org/httpclient-3.x/ HttpClient官方網站 2.http://jakarta.apache.org/commons/httpclient/ HttpClient首頁 3.http://hc.apache.org/downloads.cgi HttpClient下載 4.http://www.leadtoit.cn/subject.php?id=6 力度IT網HttpClient專題 5.http://www.blogjava.net/Alpha/archive/2007/01/22/95216.html HttpClient 學習整理 6.http://www.ibm.com/developerworks/cn/opensource/os-httpclient/ HttpClient入門 7.http://blog.csdn.net/ambitiontan/archive/2006/01/06/572171.aspx 應用HttpClient來對付各種頑固的WEB伺服器 8.http://www.pmjava.com/Article/ShowInfo.asp?ID=2147 httpclient 4.0的例子 執行個體 :private void send(String url,String requestXml){ String body = ""; PostMethod postMethod=null; try { HttpClient httpClient = new HttpClient(); httpClient.getParams().setBooleanParameter("http.protocol.expect-continue", false); postMethod=new PostMethod(url); NameValuePair[] dataxml = { new NameValuePair("data", requestXml)}; postMethod.setRequestBody(dataxml); postMethod.addRequestHeader("Accept", "text/plain"); postMethod.addRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); postMethod.setRequestHeader("Connection", "close"); int retcode = httpClient.executeMethod(postMethod); if (retcode != HttpStatus.SC_OK) {// 發送不成功 facesMessages.add("查詢出錯不成功"); } else { body = postMethod.getResponseBodyAsString(); if ("201".equals(body) ) { facesMessages.add("您對編號為" + complaint.getNumber() + "的投訴做“待改進”操作成功,即發送其到了QSI系統。。"); } else { facesMessages.add("您對編號為" + complaint.getNumber() + "的投訴做“待改進”操作失敗。。"); } } } catch (Exception e) { facesMessages.add("對不起,由於發生某種異常而未能正常查詢訂單資訊。請重新再試。。。"); log.error("", e, ""); }finally{ if (postMethod != null) { postMethod.releaseConnection(); } } }