qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請?jiān)L問 http://qaseven.github.io/

          對Java的HttpURLConnection的封裝類

          用于模擬瀏覽器訪問網(wǎng)頁,抓取站點(diǎn)源文件。
            HttpClient(現(xiàn)在是HttpComponents)把問題搞復(fù)雜了。其實(shí)Java內(nèi)置的HttpURLConnection很好的。HttpComponents不但復(fù)雜,而且有小問題。Java API沒有內(nèi)置HttpComponents是應(yīng)該是有考慮的,HttpURLConnection已經(jīng)可以了。
            * 基于HttpURLConnection
            * version 1.0.0_00,支持POST數(shù)據(jù),支持SSL,支持上傳文件。
            * GET、POST方式無需設(shè)置自動(dòng)判斷。
            * 代碼經(jīng)過優(yōu)化和修理。
            【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文檔
            【示例】
            舉一個(gè)幾乎用到所有功能的例子
          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();
          /**
          * 另一個(gè)訪問,cookie和session你都不用管了,會(huì)自動(dòng)處理,會(huì)處理包括cookie的過期時(shí)間等等。這就像瀏覽器的兩個(gè)標(biāo)簽頁一樣。
          */
          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();
          /**
          * 打印返回的結(jié)果出來
          */
          //狀況
          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));
          }
          //內(nèi)容
          //壓縮的
          if (http2.getHeader("Content-Encoding") != null) {
          System.out.println("-------response content 壓縮的,格式為" + http2.getHeader("Content-Encoding"));
          //使用http2.getInputStream()得到二進(jìn)制流,做其它處理,解壓縮、保存到文件等等。
          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()方法返回一個(gè)輸入流呢?
            原因一,有些網(wǎng)站會(huì)不定次地發(fā)送壓縮格式的body,例如百度。本類不予解壓縮,因?yàn)楸绢愔回?fù)責(zé)抓取而不負(fù)責(zé)對文檔進(jìn)行解析,壓縮類型(gzip等)不確定,返回的文檔也不一定是什么文檔。可根據(jù)getHeader("Content-Encoding")的值判斷壓縮情況。
            原因二,java中都是對流進(jìn)行操作,這是個(gè)標(biāo)準(zhǔn)的、默認(rèn)的接口。

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


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


          網(wǎng)站導(dǎo)航:
           
          <2013年11月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 子长县| 阳朔县| 专栏| 石泉县| 平顺县| 中超| 石河子市| 富民县| 平湖市| 高台县| 武义县| 青神县| 青龙| 荔波县| 望都县| 宁远县| 都匀市| 台北县| 进贤县| 延庆县| 柘城县| 蓬安县| 柘荣县| 航空| 新晃| 仙游县| 灵山县| 尤溪县| 六盘水市| 平远县| 沛县| 宾川县| 马鞍山市| 秦皇岛市| 麟游县| 平乡县| 兰溪市| 宜都市| 涪陵区| 科尔| 青海省|