今天跟大家唠唠我最近鼓捣的 HttpClient jar 包那点事儿。
这玩意儿,一开始上手有点懵。需求是这样的,我需要用 Java 写个小工具,得能发送 HTTP 请求,简单来说就是个“网络搬运工”。之前用过一些其他的库,但总感觉差点意思,要么太重,要么配置太麻烦。后来一哥们儿推荐我用 HttpClient,说这玩意儿挺灵活,用起来也顺手。
得,那就开始呗。
第一步,当然是找 HttpClient 的 jar 包。我直接去 Apache 的官网(反正搜“HttpClient download”出来的第一个一般就是),吭哧吭哧下一个最新版本的。这玩意儿有好几个 jar 包,httpclient、httpcore 啥的,一股脑全下,一股脑全扔到我的项目 lib 目录下。当时也没细看,想着“宁可多下,不可少下”,先把环境搭起来再说。
下包,接着就是在项目里引入这些 jar 包。我是用的 IDEA,直接在 Project Structure 里面,Modules -> Dependencies,然后点那个加号,选择“JARs or directories...”,把刚才下载的那堆 jar 包一股脑全选进去。
万事俱备,开始写代码!
我先写个最简单的 GET 请求。HttpClient 嘛得先创建一个 HttpClient 对象。然后创建一个 HttpGet 对象,把 URL 塞进去。用 HttpClient 执行这个 HttpGet,拿到一个 HttpResponse 对象。从 HttpResponse 里把内容读出来。
java
// 创建 HttpClient
HttpClient httpClient = *();
// 创建 HttpGet 请求
HttpGet httpGet = new HttpGet("*");
// 执行请求
HttpResponse response = *(httpGet);
// 获取响应状态码
int statusCode = *().getStatusCode();
// 获取响应内容
HttpEntity entity = *();
String content = *(entity, "UTF-8");
// 打印结果
*("Status Code: " + statusCode);
*("Content: " + content);
这段代码跑起来,果然能拿到网页的内容,感觉还不错。但是,问题也来。
我发现有些网站,直接用上面的代码会报错,说是什么编码不对。后来查一下,原来是有些网站的响应头里没指定编码,HttpClient 默认用 ISO-8859-1 来解码,这肯定不行。
于是我就改下代码,强制指定 UTF-8 编码:
java
String content = *(entity, "UTF-8");
这样改之后,大部分网站都能正常获取内容。但是,还是有些网站不行,报的错也不一样,五花八门。
后来我发现 HttpClient 还有一些高级用法,可以设置请求头、超时时间、代理等等。我就开始一个个试。
比如,设置 User-Agent,模拟浏览器:
java
*("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
设置超时时间,防止程序一直卡住:
java
RequestConfig requestConfig = *()
.setConnectTimeout(5000) // 设置连接超时时间
.setSocketTimeout(5000) // 设置读取超时时间
.build();
*(requestConfig);
如果遇到需要 POST 请求的,HttpClient 也有相应的 API。创建一个 HttpPost 对象,然后把参数塞进去:
java
HttpPost httpPost = new HttpPost("*/post");
List *(new BasicNameValuePair("param1", "value1")); *(new BasicNameValuePair("param2", "value2")); *(new UrlEncodedFormEntity(params, "UTF-8")); HttpResponse response = *(httpPost); 捣鼓一段时间,我对 HttpClient 的用法也算是有个基本的解。虽然中间遇到不少坑,但也算是都填平。HttpClient 还是挺好用的,功能强大,配置灵活。 不过我也发现 HttpClient 还是有些地方不太方便。比如,每次都要自己处理异常,自己关闭连接。如果能封装一下,用起来就更舒服。 我下一步的计划是,把 HttpClient 封装成一个工具类,提供更简洁的 API。这样,以后再用 HTTP 请求,就不用写那么多重复的代码。 这回分享就到这儿,希望对大家有所帮助。如果大家有什么 HttpClient 的使用心得,也欢迎在评论区分享。