qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          對Java的HttpURLConnection的封裝類

          用于模擬瀏覽器訪問網頁,抓取站點源文件。
            HttpClient(現在是HttpComponents)把問題搞復雜了。其實Java內置的HttpURLConnection很好的。HttpComponents不但復雜,而且有小問題。Java API沒有內置HttpComponents是應該是有考慮的,HttpURLConnection已經可以了。
            * 基于HttpURLConnection
            * version 1.0.0_00,支持POST數據,支持SSL,支持上傳文件。
            * GET、POST方式無需設置自動判斷。
            * 代碼經過優化和修理。
            【API簡介】
            該class沒有字段。
            該class的方法:
          Http(String urlString, String charset);
          execute();
          setHeader(String name, String value);
          setTimeOut(int ms);
          addPostData(String name, String value);
          addUploadFile(String name, String path, String rename);
          getInputStream();
          getHeader(String key);
          getHeaders();
          javadoc文檔
            【示例】
            舉一個幾乎用到所有功能的例子
          import http.Http;
          import java.util.*;
          import java.io.*;
          public class NewClass {
          public static void main(String[] args) throws Exception {
          String charset = "gbk";
          Http http1 = new Http("http://xxxxxxx/login.php", charset);
          /**
          * 登錄
          */
          http1.addPostData("username", "username中文");
          http1.addPostData("password", "password中文");
          http1.execute();
          /**
          * 另一個訪問,cookie和session你都不用管了,會自動處理,會處理包括cookie的過期時間等等。這就像瀏覽器的兩個標簽頁一樣。
          */
          Http http2 = new Http("http://xxxxxxx/xxxxxx.php", charset);
          http2.addPostData("testfield", "testfieldvalue中文1");
          http2.addPostData("mycheckbox[]", "testfieldvalue中文2");
          http2.addPostData("mycheckbox[]", "testfieldvalue中文3");
          http2.addUploadFile("fieldName", "F:\\NetBeansProjects\\Wrapper\\src\\upfile.txt"
          , "rename.txt");
          http2.execute();
          /**
          * 打印返回的結果出來
          */
          //狀況
          System.out.println("-------response header-------");
          Map<String, List<String>> headersMap = http2.getHeaders();
          for (Map.Entry<String, List<String>> entry : headersMap.entrySet()) {
          String string = entry.getKey();
          List<String> list = entry.getValue();
          System.out.println(string + ": " + list.get(0));
          }
          //內容
          //壓縮的
          if (http2.getHeader("Content-Encoding") != null) {
          System.out.println("-------response content 壓縮的,格式為" + http2.getHeader("Content-Encoding"));
          //使用http2.getInputStream()得到二進制流,做其它處理,解壓縮、保存到文件等等。
          return;
          }
          //非壓縮的
          System.out.println("-------response content-------");
          InputStreamReader isr = new InputStreamReader(http2.getInputStream(), charset);
          StringBuilder stringBuilder = new StringBuilder();
          int len;
          char[] cbuf = new char[1024];
          while ((len = isr.read(cbuf)) >= 0) {
          if (len == 1024) {
          stringBuilder.append(cbuf);
          } else {
          stringBuilder.append(cbuf, 0, len);
          }
          }
          System.out.println(stringBuilder.toString());
          }
          }
            附注:
            為什么沒有直接返回頁面文本而是通過getInputStream()方法返回一個輸入流呢?
            原因一,有些網站會不定次地發送壓縮格式的body,例如百度。本類不予解壓縮,因為本類只負責抓取而不負責對文檔進行解析,壓縮類型(gzip等)不確定,返回的文檔也不一定是什么文檔。可根據getHeader("Content-Encoding")的值判斷壓縮情況。
            原因二,java中都是對流進行操作,這是個標準的、默認的接口。

          posted on 2013-11-21 12:51 順其自然EVO 閱讀(689) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2013年11月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 马关县| 三江| 江阴市| 鹿泉市| 石渠县| 祁东县| 浙江省| 武汉市| 盐山县| 安泽县| 社旗县| 四会市| 彝良县| 南投市| 伊通| 邢台市| 育儿| 大姚县| 金川县| 景德镇市| 台州市| 法库县| 晋城| 大方县| 奉贤区| 郑州市| 历史| 郯城县| 丰县| 鲁甸县| 呼和浩特市| 西乌珠穆沁旗| 合川市| 克什克腾旗| 赫章县| 凯里市| 东乌珠穆沁旗| 偃师市| 兴文县| 剑川县| 姚安县|