httpClient實現遠程調用 備案

來源:互聯網
上載者:User
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();           }       }    }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.