当前位置:   article > 正文

Hutool-http的使用和一些问题

hutool-http

Hutool-http是什么

简介

Hutool-http针对JDK的HttpUrlConnection做一层封装,简化了HTTPS请求、文件上传、Cookie记忆等操作,使Http请求变得无比简单。其核心类为HttpRequest和HttpResponse。与此同时,Hutool-http针对一些场景封装了HttpUtil工具类,让一些操作变得更简单。

优点

  1. 根据URL自动判断是请求HTTP还是HTTPS,不需要单独写多余的代码。
  2. 表单数据中有File对象时自动转为multipart/form-data表单,不必单做做操作。
  3. 默认情况下Cookie自动记录,比如可以实现模拟登录,即第一次访问登录URL后后续请求就是登录状态。
  4. 自动识别304跳转并二次请求
  5. 自动识别页面编码,即根据header信息或者页面中的相关标签信息自动识别编码,最大可能避免乱码。
  6. 自动识别并解压Gzip格式返回内容

Hutool-http的使用

HttpUtil工具类

HttpUtil本质上是对HttpRequest中的一些常用方法的封装,使用起来非常方便。

get和post例子

get方法:HttpUtil.get

  1. // 最简单的HTTP请求,可以自动通过header等信息判断编码,不区分HTTP和HTTPS
  2. String result1= HttpUtil.get("https://www.baidu.com");
  3. // 当无法识别页面编码的时候,可以自定义请求页面的编码
  4. String result2= HttpUtil.get("https://www.baidu.com", CharsetUtil.CHARSET_UTF_8);
  5. //可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中
  6. HashMap<String, Object> paramMap = new HashMap<>();
  7. paramMap.put("city", "北京");
  8. String result3= HttpUtil.get("https://www.baidu.com", paramMap);

post方法:HttpUtil.post

  1. HashMap<String, Object> paramMap = new HashMap<>();
  2. paramMap.put("city", "北京");
  3. String result= HttpUtil.post("https://www.baidu.com", paramMap);
  4. 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请求例子:

  1. String result1 = HttpRequest.post(url)
  2. .header(Header.USER_AGENT, "Hutool http")//头信息,多个头信息多次调用此方法即可
  3. .form(paramMap)//表单内容
  4. .timeout(20000)//超时,毫秒
  5. .execute().body();
  6. String result2 = HttpRequest.post(url)
  7. .header(Header.USER_AGENT, "Hutool http")//头信息,多个头信息多次调用此方法即可
  8. .body(paramMap.toString())//body内容
  9. .timeout(20000)//超时,毫秒
  10. .execute().body();

 通过链式构建请求,我们可以很方便的指定Http头信息和表单信息,最后调用execute方法即可执行请求,返回HttpResponse对象。HttpResponse包含了服务器响应的一些信息,包括响应的内容和响应的头信息。通过调用body方法即可获取响应内容。

其中form()和body()分别对应HttpUtil中post两种传参方式。

一些问题

URL重定向问题

问题

在发送请求时,目标url可能会出现重定向问题,导致获取的返回信息为空。比如对一个需要登陆才能使用的功能url发送请求时,此时没有先发送登录请求的话,可能目标url会自动将url重定向到登录url。

 如图所示:请求URL被重定向到了登录界面Location。此时可能获取不到任何返回信息。

解决方法

HttpUtil中有一个方法createGet()可以解决这个问题。方法定义如下:

  1. public static HttpRequest createGet(String url, boolean isFollowRedirects) {
  2. return HttpRequest.get(url).setFollowRedirects(isFollowRedirects);
  3. }

包含两个参数,url和isFollowRedirects。如果目标url发生了重定向,可以将isFollowRedirects设置为true。使用方法如下:

  1. String result = HttpUtil.createGet(url,true)
  2. .header(Header.COOKIE,cookie)
  3. .body(param.toString())
  4. .execute().body();

这样就可以获取目标url在重定向之前返回的信息。

参考文献:

Hutool-http官方文档:概述 (hutool.cn)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/544568
推荐阅读
相关标签
  

闽ICP备14008679号