Java请求Http接口-hutool的HttpUtil(超详细-附带工具类)

2024-02-26 1189阅读

温馨提示:这篇文章已超过398天没有更新,请注意相关的内容是否还可用!

概述

HttpUtil是应对简单场景下Http请求的工具类封装,此工具封装了HttpRequest对象常用操作,可以保证在一个方法之内完成Http请求。

此模块基于JDK的HttpUrlConnection封装完成,完整支持https、代理和文件上传。

导包

        
            cn.hutool
            hutool-all
            5.7.1
        

读取页面,返回整个页面内容报文

针对最为常用的GET和POST请求,HttpUtil封装了两个方法,

  • HttpUtil.get
  • HttpUtil.post

    这两个方法用于请求普通页面,然后返回页面内容的字符串,同时提供一些重载方法用于指定请求参数(指定参数支持File对象,可实现文件上传,当然仅仅针对POST请求)。

    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 = new HashMap();
    paramMap.put("city", "北京");
    String result3= HttpUtil.get("https://www.baidu.com", paramMap);
    

    返回结果:

    Java请求Http接口-hutool的HttpUtil(超详细-附带工具类)

    post 请求页面

    HashMap paramMap = new HashMap();
    paramMap.put("city", "北京");
    String result= HttpUtil.post("https://www.baidu.com", paramMap);
    

    上传文件

    HashMap paramMap = new HashMap();
    //文件上传只需将参数中的键指定(默认file),值设为文件对象即可,对于使用者来说,文件上传与普通表单提交并无区别
    paramMap.put("file", FileUtil.file("D:\\face.jpg"));
    String result= HttpUtil.post("https://www.baidu.com", paramMap);
    

    下载文件

    因为Hutool-http机制问题,请求页面返回结果是一次性解析为byte[]的,如果请求URL返回结果太大(比如文件下载),那内存会爆掉,因此针对文件下载HttpUtil单独做了封装。文件下载在面对大文件时采用流的方式读写,内存中只是保留一定量的缓存,然后分块写入硬盘,因此大文件情况下不会对内存有压力。

    String fileUrl = "http://mirrors.sohu.com/centos/8.4.2105/isos/x86_64/CentOS-8.4.2105-x86_64-dvd1.iso";
    //将文件下载后保存在E盘,返回结果为下载文件大小
    long size = HttpUtil.downloadFile(fileUrl, FileUtil.file("e:/"));
    System.out.println("Download size: " + size);
    

    当然,如果我们想感知下载进度,还可以使用另一个重载方法回调感知下载进度:

    //带进度显示的文件下载
    HttpUtil.downloadFile(fileUrl, FileUtil.file("e:/"), new StreamProgress(){
        
        @Override
        public void start() {
            Console.log("开始下载。。。。");
        }
        
        @Override
        public void progress(long progressSize) {
            Console.log("已下载:{}", FileUtil.readableFileSize(progressSize));
        }
        
        @Override
        public void finish() {
            Console.log("下载完成!");
        }
    });
    

    其他方法

    • HttpUtil.encodeParams 对URL参数做编码,只编码键和值,提供的值可以是url附带参数,但是不能只是url
    • HttpUtil.toParams和HttpUtil.decodeParams 两个方法是将Map参数转为URL参数字符串和将URL参数字符串转为Map对象
    • HttpUtil.urlWithForm是将URL字符串和Map参数拼接为GET请求所用的完整字符串使用
    • HttpUtil.getMimeType 根据文件扩展名快速获取其MimeType(参数也可以是完整文件路径)

      resul 接口

      本质上,HttpUtil中的get和post工具方法都是HttpRequest对象的封装,因此如果想更加灵活操作Http请求,可以使用HttpRequest。

      get请求

      public static JSONObject get(String url, Map queryParams, Map headers) throws IOException {
              String body = HttpRequest.get(url).form(queryParams).addHeaders(headers).execute().body();
              return JSONObject.parseObject(body);
          }
      

      post 表单请求

       public static JSONObject post(String url, Map queryParams, Map headers) {
              String body = HttpRequest.post(url)
                      .header(Header.USER_AGENT, "Hutool http")//头信息,多个头信息多次调用此方法即可
                      .form(queryParams)//表单内容
                      .timeout(20000)//超时,毫秒
                      .execute().body();
              return JSONObject.parseObject(body);
          }
      

      post -json 请求

       public static JSONObject post(String url, String json, Map headers) {
              String body = HttpRequest.post(url).body(json).addHeaders(headers).execute().body();
              return JSONObject.parseObject(body);
          }
      

      配置代理

      String result2 = HttpRequest.post(url)
          .setHttpProxy("127.0.0.1", 9080)
          .body(json)
          .execute().body();
      
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]