<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Jason ---分享,共同進步

    激情成就夢想,努力創造未來
    隨筆 - 53, 文章 - 1, 評論 - 45, 引用 - 0
    數據加載中……

    httpclient (2)

    根據以上步驟,我們來編寫用GET方法來取得某網頁內容的代碼。

    • 大部分情況下 HttpClient 默認的構造函數已經足夠使用。
      HttpClient httpClient = new HttpClient();
                      

    • 創建GET方法的實例。在GET方法的構造函數中傳入待連接的地址即可。用GetMethod將會自動處理轉發過程,如果想要把自動處理轉發過程去掉的話,可以調用方法setFollowRedirects(false)。
      GetMethod getMethod = new GetMethod("http://www.ibm.com/");
                      

    • 調用實例httpClient的executeMethod方法來執行getMethod。由于是執行在網絡上的程序,在運行executeMethod方法的時候,需要處理兩個異常,分別是HttpException和IOException。引起第一種異常的原因主要可能是在構造getMethod的時候傳入的協議不對,比如不小心將"http"寫成"htp",或者服務器端返回的內容不正常等,并且該異常發生是不可恢復的;第二種異常一般是由于網絡原因引起的異常,對于這種異常 (IOException),HttpClient會根據你指定的恢復策略自動試著重新執行executeMethod方法。HttpClient的恢復策略可以自定義(通過實現接口HttpMethodRetryHandler來實現)。通過httpClient的方法setParameter設置你實現的恢復策略,本文中使用的是系統提供的默認恢復策略,該策略在碰到第二類異常的時候將自動重試3次。executeMethod返回值是一個整數,表示了執行該方法后服務器返回的狀態碼,該狀態碼能表示出該方法執行是否成功、需要認證或者頁面發生了跳轉(默認狀態下GetMethod的實例是自動處理跳轉的)等。
      //設置成了默認的恢復策略,在發生異常時候將自動重試3次,在這里你也可以設置成自定義的恢復策略
                      getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
                      new DefaultHttpMethodRetryHandler());
                      //執行getMethod
                      int statusCode = client.executeMethod(getMethod);
                      if (statusCode != HttpStatus.SC_OK) {
                      System.err.println("Method failed: " + getMethod.getStatusLine());
                      }
                      

    • 在返回的狀態碼正確后,即可取得內容。取得目標地址的內容有三種方法:第一種,getResponseBody,該方法返回的是目標的二進制的byte流;第二種,getResponseBodyAsString,這個方法返回的是String類型,值得注意的是該方法返回的String的編碼是根據系統默認的編碼方式,所以返回的String值可能編碼類型有誤,在本文的"字符編碼"部分中將對此做詳細介紹;第三種,getResponseBodyAsStream,這個方法對于目標地址中有大量數據需要傳輸是最佳的。在這里我們使用了最簡單的getResponseBody方法。
      byte[] responseBody = method.getResponseBody();
                      

    • 釋放連接。無論執行方法是否成功,都必須釋放連接。
      method.releaseConnection();
                      

    • 處理內容。在這一步中根據你的需要處理內容,在例子中只是簡單的將內容打印到控制臺。
      System.out.println(new String(responseBody));
                      

    下面是程序的完整代碼,這些代碼也可在附件中的test.GetSample中找到。


    package test;
                import java.io.IOException;
                import org.apache.commons.httpclient.*;
                import org.apache.commons.httpclient.methods.GetMethod;
                import org.apache.commons.httpclient.params.HttpMethodParams;
                public class GetSample{
                public static void main(String[] args) {
                //構造HttpClient的實例
                HttpClient httpClient = new HttpClient();
                //創建GET方法的實例
                GetMethod getMethod = new GetMethod("http://www.ibm.com");
                //使用系統提供的默認的恢復策略
                getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
                new DefaultHttpMethodRetryHandler());
                try {
                //執行getMethod
                int statusCode = httpClient.executeMethod(getMethod);
                if (statusCode != HttpStatus.SC_OK) {
                System.err.println("Method failed: "
                + getMethod.getStatusLine());
                }
                //讀取內容
                byte[] responseBody = getMethod.getResponseBody();
                //處理內容
                System.out.println(new String(responseBody));
                } catch (HttpException e) {
                //發生致命的異常,可能是協議不對或者返回的內容有問題
                System.out.println("Please check your provided http address!");
                e.printStackTrace();
                } catch (IOException e) {
                //發生網絡異常
                e.printStackTrace();
                } finally {
                //釋放連接
                getMethod.releaseConnection();
                }
                }
                }
                

    POST方法

    根據RFC2616,對POST的解釋如下:POST方法用來向目的服務器發出請求,要求它接受被附在請求后的實體,并把它當作請求隊列(Request-Line)中請求URI所指定資源的附加新子項。POST被設計成用統一的方法實現下列功能:

    • 對現有資源的注釋(Annotation of existing resources)
    • 向電子公告欄、新聞組,郵件列表或類似討論組發送消息
    • 提交數據塊,如將表單的結果提交給數據處理過程
    • 通過附加操作來擴展數據庫

    調用HttpClient中的PostMethod與GetMethod類似,除了設置PostMethod的實例與GetMethod有些不同之外,剩下的步驟都差不多。在下面的例子中,省去了與GetMethod相同的步驟,只說明與上面不同的地方,并以登錄清華大學BBS為例子進行說明。

    • 構造PostMethod之前的步驟都相同,與GetMethod一樣,構造PostMethod也需要一個URI參數,在本例中,登錄的地址是http://www.newsmth.net/bbslogin2.php。在創建了PostMethod的實例之后,需要給method實例填充表單的值,在BBS的登錄表單中需要有兩個域,第一個是用戶名(域名叫id),第二個是密碼(域名叫passwd)。表單中的域用類NameValuePair來表示,該類的構造函數第一個參數是域名,第二參數是該域的值;將表單所有的值設置到PostMethod中用方法setRequestBody。另外由于BBS登錄成功后會轉向另外一個頁面,但是HttpClient對于要求接受后繼服務的請求,比如POST和PUT,不支持自動轉發,因此需要自己對頁面轉向做處理。具體的頁面轉向處理請參見下面的"自動轉向"部分。代碼如下:
      String url = "http://www.newsmth.net/bbslogin2.php";
                      PostMethod postMethod = new PostMethod(url);
                      // 填入各個表單域的值
                      NameValuePair[] data = { new NameValuePair("id", "youUserName"),
                      new NameValuePair("passwd", "yourPwd") };
                      // 將表單的值放入postMethod中
                      postMethod.setRequestBody(data);
                      // 執行postMethod
                      int statusCode = httpClient.executeMethod(postMethod);
                      // HttpClient對于要求接受后繼服務的請求,象POST和PUT等不能自動處理轉發
                      // 301或者302
                      if (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;
                      }
                      

    posted on 2008-01-29 14:55 agun 閱讀(475) 評論(0)  編輯  收藏 所屬分類: java web

    主站蜘蛛池模板: 毛片A级毛片免费播放| 免免费国产AAAAA片| 亚洲国产成人久久综合野外| 亚洲一日韩欧美中文字幕在线| 国产精品无码免费播放| 中文字幕乱码亚洲无线三区| 暖暖在线日本免费中文| 日韩欧美亚洲国产精品字幕久久久| 国产无遮挡吃胸膜奶免费看| 黄色三级三级三级免费看| 国产亚洲情侣一区二区无| 国产成人AV片无码免费| 亚洲国产日韩女人aaaaaa毛片在线| 青草草色A免费观看在线| 亚洲欧美乱色情图片| 四虎国产精品免费久久影院| sss日本免费完整版在线观看| 亚洲精品国产精品乱码视色 | 亚洲国产高清国产拍精品| 免费无码又爽又刺激高潮| 青草青草视频2免费观看| 亚洲av日韩片在线观看| 日本视频免费高清一本18| 亚洲国产综合在线| 国产jizzjizz视频全部免费| 91成人免费福利网站在线| 亚洲AV一二三区成人影片| 亚洲av无码成人精品区| 久久一本岛在免费线观看2020| 亚洲成a人片在线看| 亚洲精品无码日韩国产不卡?V| 日韩电影免费观看| 亚洲欧好州第一的日产suv| 亚洲区小说区图片区| 8x8×在线永久免费视频| 亚洲av成人无码网站…| 老汉色老汉首页a亚洲| 国产乱子伦精品免费无码专区 | 免费看少妇作爱视频| 久久免费观看视频| 亚洲人成人伊人成综合网无码|