对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(“”, charset);

  /**

  * 登录

  */

  (“username”, “username中文”);

  (“password”, “password中文”);

  ();

  /**

  * 另一个访问,cookie和session你都不用管了,会自动处理,会处理包括cookie的过期时间等等。这就像浏览器的两个标签页一样。

  */

  Http http2 = new Http(“”, charset);

  (“testfield”, “testfieldvalue中文1”);

  (“mycheckbox[]”, “testfieldvalue中文2”);

  (“mycheckbox[]”, “testfieldvalue中文3”);

  (“fieldName”, “F:\\NetBeansProjects\\Wrapper\\src\\upfile.txt”

  , “rename.txt”);

  ();

  /**

  * 打印返回的结果出来

  */

  //状况

  System.out.println(“——-response header——-“);

  Map<String, List<String>> headersMap = ();

  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 ((“Content-Encoding”) != null) {

  System.out.println(“——-response content 压缩的,格式为” + (“Content-Encoding”));

  //使用()得到二进制流,做其它处理,解压缩、保存到文件等等。

  return;

  }

  //非压缩的

  System.out.println(“——-response content——-“);

  InputStreamReader isr = new InputStreamReader((), 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中都是对流进行操作,这是个标准的、默认的接口。

偶尔也要现实和虚伪一点,因为不那样做的话,很难混。

对Java的HttpURLConnection的封装类

相关文章:

你感兴趣的文章:

标签云: