Hutool-http是什么
简介
Hutool-http针对JDK的HttpUrlConnection做一层封装,简化了HTTPS请求、文件上传、Cookie记忆等操作,使Http请求变得无比简单。其核心类为HttpRequest和HttpResponse。与此同时,Hutool-http针对一些场景封装了HttpUtil工具类,让一些操作变得更简单。
优点
根据URL自动判断是请求HTTP还是HTTPS,不需要单独写多余的代码。表单数据中有File对象时自动转为multipart/form-data表单,不必单做做操作。默认情况下Cookie自动记录,比如可以实现模拟登录,即第一次访问登录URL后后续请求就是登录状态。自动识别304跳转并二次请求自动识别页面编码,即根据header信息或者页面中的相关标签信息自动识别编码,最大可能避免乱码。自动识别并解压Gzip格式返回内容
Hutool-http的使用
HttpUtil工具类
HttpUtil本质上是对HttpRequest中的一些常用方法的封装,使用起来非常方便。
get和post例子
get方法:HttpUtil.get
// 最简单的HTTP请求,可以自动通过header等信息判断编码,不区分HTTP和HTTPS
String result1= HttpUtil.get("https://www.baidu.com");
// 当无法识别页面编码的时候,可以自定义请求页面的编码
String result2= HttpUtil.get("https://www.baidu.com", CharsetUtil.CHARSET_UTF_8);
//可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中
HashMap
paramMap.put("city", "北京");
String result3= HttpUtil.get("https://www.baidu.com", paramMap);
post方法:HttpUtil.post
HashMap
paramMap.put("city", "北京");
String result= HttpUtil.post("https://www.baidu.com", paramMap);
String result= HttpUtil.post("https://www.baidu.com", paramMap.toString());
post()中传参传的是Map类型的paramMap作为参数时,使用的是form形式进行传参。post()中传参传的是String类型的paramMap.toString()作为参数时,使用的是body形式进行传参。
要根据具体的业务需求和服务器端的接收方式来选择使用form还是body。如果需要将数据以标准的表单形式提交,可以使用form;如果需要传输复杂的数据结构或特定的数据格式,可以使用body。
HttpRequest的使用
本质上,HttpUtil中的get和post工具方法都是HttpRequest对象的封装,因此如果想更加灵活操作Http请求,可以使用HttpRequest。
post请求例子:
String result1 = HttpRequest.post(url)
.header(Header.USER_AGENT, "Hutool http")//头信息,多个头信息多次调用此方法即可
.form(paramMap)//表单内容
.timeout(20000)//超时,毫秒
.execute().body();
String result2 = HttpRequest.post(url)
.header(Header.USER_AGENT, "Hutool http")//头信息,多个头信息多次调用此方法即可
.body(paramMap.toString())//body内容
.timeout(20000)//超时,毫秒
.execute().body();
通过链式构建请求,我们可以很方便的指定Http头信息和表单信息,最后调用execute方法即可执行请求,返回HttpResponse对象。HttpResponse包含了服务器响应的一些信息,包括响应的内容和响应的头信息。通过调用body方法即可获取响应内容。
其中form()和body()分别对应HttpUtil中post两种传参方式。
一些问题
URL重定向问题
问题
在发送请求时,目标url可能会出现重定向问题,导致获取的返回信息为空。比如对一个需要登陆才能使用的功能url发送请求时,此时没有先发送登录请求的话,可能目标url会自动将url重定向到登录url。
如图所示:请求URL被重定向到了登录界面Location。此时可能获取不到任何返回信息。
解决方法
HttpUtil中有一个方法createGet()可以解决这个问题。方法定义如下:
public static HttpRequest createGet(String url, boolean isFollowRedirects) {
return HttpRequest.get(url).setFollowRedirects(isFollowRedirects);
}
包含两个参数,url和isFollowRedirects。如果目标url发生了重定向,可以将isFollowRedirects设置为true。使用方法如下:
String result = HttpUtil.createGet(url,true)
.header(Header.COOKIE,cookie)
.body(param.toString())
.execute().body();
这样就可以获取目标url在重定向之前返回的信息。
参考文献:
Hutool-http官方文档:概述 (hutool.cn)
推荐文章
发表评论