对Java的HttpURLConnection的封装类 v3.0

用于模拟浏览器访问网页,抓取站点源文件。

有个第三方社区项目HttpClient(现在是HttpComponents)把问题搞复杂了。其实Java内置的HttpURLConnection很好的。HttpComponents不但复杂,而且有小问题。Java APIs没有内置HttpComponents应该是有考虑的。

* 基于HttpURLConnection

* version 3.0,支持上传文件。

* GET、POST方式无需设置(只要调用addPostData方法即为POST方式)。

* Cookie、Session自动处理。

【API简介】

该class没有公开字段。

该class的方法:

Http(String urlString, String charset);

request();

setHeader(String name, String value);

setTimeOut(int newTimeOut);

addPostData(String name, String value);

addUploadFile(String name, String path, String rename);

getInputStream();

getHeader(String key);

getHeaders();

javadoc文档
文档 这里下载

【示例】

举一个几乎用到所有功能的sample:

import wrapper.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.request();
        /**
         * 另一个访问,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:/upfile.zip", "rename.zip");

        http2.request();
        /**
         * 打印返回的结果出来
         */
        //状况
        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("压缩的,格式为" + 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) {
            stringBuilder.append(cbuf, 0, len);
        }
        System.out.println(stringBuilder.toString());
    }
}

附注:
为什么没有直接返回页面文本而是通过 getInputStream()方法返回一个输入流呢?
原因一,有些网站会不定次地发送压缩格式的body,例如百度。本类只负责抓取。压缩类型(gzip等)不确定,返回的文档也不一定是什么文档。本类不予解压缩,也不负责对文档进行解析。可根据getHeader("Content-Encoding")的值判断压缩情况。
原因二,在Java语言中都是对流进行操作,这是个标准的、默认的接口。过高封装会导致无法与其它API配合使用。

jar库包下载

jar包(含文档)到这里下载

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值