对Java的HttpURLConnection的封装类

    xiaoxiao2022-07-16  152

    用于模拟浏览器访问网页,抓取站点源文件。   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中都是对流进行操作,这是个标准的、默认的接口。 最新内容请见作者的GitHub页:http://qaseven.github.io/ 相关资源:一文读懂JAVA中HttpURLConnection的用法
    最新回复(0)