首页 > 其他分享 >HttpUtils 详解

HttpUtils 详解

时间:2024-10-17 15:04:22浏览次数:7  
标签:http String HttpUtils 详解 result 请求 Result

一、详解

1.1 介绍

现如今的 Web 项目,由服务端向外发起网络请求的场景,基本上随处可见!
传统情况下,在服务端代码里访问 http 服务时,一般会使用 JDK 的 HttpURLConnection 或者 Apache 的 HttpClient,不过这种方法使用起来太过繁琐,而且 api 使用起来非常的复杂,还得操心资源回收。

1.2 什么是 HttpUtils?

  • HttpUtils 是 Solon 提供的进行远程调用客户端
  • HttpUtils 提供了很多远程调用的方法,能够大大提高客户端的编写效率。 HttpUtils 接口实现了 HttpURLConnection 的适配(默认),以及 OkHttp 的适配。
  • 官网地址: solon-net-httputils

1.3 引入依赖

<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon-net-httputils</artifactId>
</dependency>

HttpUtils 不需要初始化,即可直接使用。而且,可以直接使用负载均衡的能力(需要引入 solon-cloud 的插件,提供底层支持)。像这样:

HttpUtils.http("user-service", "/user/get?id=1").get();

二、接口使用

HttpUtils 最大的特色就是对各种网络请求方式做了包装,能极大的简化开发人员的工作量,下面我们以 GET、POST、PUT、DELETE、文件上传与下载为例,分别介绍各个API的使用方式。

2.1 GET 请求

通过 HttpUtils 发送 HTTP GET 协议请求,经常使用到的方法有两个:

  • get() -> String
  • getAs(Type type) -> T (支持泛型)

在 Solon 环境下写一个单元测试用例,首先创建一个 Api 接口,然后编写单元测试进行服务测试。

不带参的get请求

@Controller
public class TestController {
    @Get
    @Mapping("testGet")
    public Result testGet(){
        Result result = new Result();
        result.setCode("200");
        result.setMsg("demo...");
        return result;
    }
}

@Data
public class Result {
    private String code;
    private String msg;
}

单元测试(不带参的get请求)

@Test
public void testGet(){
    //请求地址
    String url = "http://localhost:8080/testGet";
 
    //发起请求,直接返回对象
    Result result = HttpUtils.http(url).getAs(Result.class);
    System.out.println(result.toString());

带参的get请求(使用占位符号传参)

@Controller
public class TestController {
    @Get
    @Mapping("testGetByRestFul/{id}/{name}")
    public Result testGetByRestFul(@Path("id") String id, @Path("name") String name){
        Result result = new Result();
        result.setCode("200");
        result.setMsg("demo...");
        return result;
    }
}

单元测试(带参的get请求),顺带加了个 header 信息。

@Test
public void testGetByRestFul(){
    //请求地址
    String url = "http://localhost:8080/testGetByRestFul/001/张三";
 
    //发起请求,直接返回对象(restful风格)
    Result result = HttpUtils.http(url).header("App-Id","1").getAs(Result.class);
    System.out.println(result.toString());
}

2.2 POST 请求

其实 POST 请求方法和 GET 请求方法上大同小异,HttpUtils 的 POST 请求也包含两个主要方法:

  • post() -> String
  • postAs(Type type) -> T(支持泛型)

模拟表单请求,post方法测试

@Controller
public class TestController {
    @Post
    @Mapping("testPostByForm")
    public Result testPostByForm(String userName, String userPwd){
        Result result = new Result();
        result.setCode("200");
        result.setMsg("Demo...");
        return result;
    }
}

x-www-form-urlencoded post

@Test
public void testPostByForm(){
    //请求地址
    String url = "http://localhost:8080/testPostByForm";
 
    //发起请求
    Result result = HttpUtils.http(url)
                             .data("userName", "唐三藏")
                             .data("userPwd", "123456")
                             .postAs(Result.class);
                  
    System.out.println(result.toString());
}

form-data post,顺带加上文件上传

@Test
public void testPostByForm(){
    //请求地址
    String url = "http://localhost:8080/testPostByForm";
 
    //发起请求
    Result result = HttpUtils.http(url)
                             .data("userName", "唐三藏")
                             .data("userPwd", "123456")
                             .data("file", "logo.jpg", new File("/data/logo.jpg")) 
                             .postAs(Result.class, true); //useMultipart = true
                  
    System.out.println(result.toString());
}

json-body post

@Test
public void testPostByForm(){
    //请求地址
    String url = "http://localhost:8080/testPostByForm";
 
    //发起请求
    Result result = HttpUtils.http(url)
                             .bodyOfJson("{\"userName\":\"唐三藏\",\"userPwd\":\"123456\"}")
                             .postAs(Result.class); 
                  
    System.out.println(result.toString());
}

bean-body post

@Test
public void testPostByForm(){
    //请求地址
    String url = "http://localhost:8080/testPostByForm";
    
    UserBean user = new UserBean();
    user.setUserName("唐三藏");
    user.setUserPwd("123456")
 
    //发起请求
    Result result = HttpUtils.http(url)
                             .bodyOfBean(user)
                             .postAs(Result.class); 
                  
    System.out.println(result.toString());
}

2.3 PUT、PATCH、DELETE 请求

用法与 POST 完全相同。

2.4 高级用法

获取响应(用完要关闭)

try(HttpResponse resp = HttpUtils.http("http://localhost:8080/hello").data("name","world").exec("POST")) {
    int code = resp.code();
    String head = resp.header("Demo-Header");
    String body = resp.bodyAsString();
}

配置序列化器。默认为 json,改为 fury;或者自己定义。

FuryBytesSerializer serializer = new FuryBytesSerializer();

Result body = HttpUtils.http("http://localhost:8080/book")
                       .serializer(serializer)
                       .bodyOfBean(book)
                       .postAs(Result.class);

标签:http,String,HttpUtils,详解,result,请求,Result
From: https://www.cnblogs.com/noear/p/18472326

相关文章

  • 解析华为鸿蒙next:Web组件自适应布局与渲染模式详解
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。Web组件大小自适应页面内容布局使用......
  • 强大灵活的文件上传库:FilePond 详解hD
    文件上传是Web开发中常见的功能,尤其是对于图片、视频、文档等大文件的处理,如何既保证用户体验,又兼顾安全和性能,是每位开发者关心的问题。在这样的背景下,FilePond作为一款灵活强大的文件上传库,逐渐在前端开发者中脱颖而出。FilePond提供了优雅的用户界面和全面的功能,同时兼容多......
  • Python爬虫:获取数据的入门详解
    在互联网时代,数据已成为最宝贵的资源之一。Python,作为一种功能强大且易于学习的编程语言,成为了数据获取和处理的理想工具。Python爬虫,特别是,允许我们从网页中自动提取大量数据,为数据分析、机器学习、研究和开发等多种应用提供了原材料。本文将为您提供一个Python爬虫的入门详解......
  • 前端常用6种数据加密方式的使用(最详解)
    原文链接:https://blog.csdn.net/2401_82471222/article/details/140538952前端常用的六种数据加密方式包括Base64编码、MD5加密、SHA-1加密、SHA-256加密、AES加密和RSA加密。每种加密方式都有其特定的使用场景和优缺点。以下是这些加密方式的详细使用说明:1.Base64编码定义与特......
  • MyBatis 动态 SQL 详解
    1.什么是动态SQL?在使用MyBatis进行数据库查询时,可能会遇到一些需要根据条件动态生成SQL语句的情况。MyBatis提供了强大的动态SQL支持,通过标签和条件语句,可以让SQL语句根据不同的输入参数动态生成。这大大提高了代码的灵活性,避免了拼接SQL语句的繁琐和出错风险。......
  • Vue3中 watch、watchEffect 详解
    Vue3中watch、watchEffect详解   1.watch的使用 监听ref定义的响应式数据 <template><div><div>值:{{count}}</div><button@click="add">改变值</button></div></template><script>import{r......
  • Python join()函数使用详解
    在Python中,join()函数是字符串的一个方法,用于将一个可迭代对象(如列表)中的元素连接成一个字符串。join()函数的语法如下:string.join(iterable)其中,string是连接中的字符串,iterable是要连接的可迭代对象。下面是join()函数的使用示例:#连接列表中的元素my_list=['Hello',......
  • [MyBatis-Plus]核心功能详解
    条件构造器MyBatisPlus支持各种复杂的where条件,可以满足日常开发的所有需求Wrapper条件构造器专门用于构造复杂的查询条件BaseMapper提供很多增删改查的方法,其中的Wrapper就是用于构建复杂查询条件的Wrapper的继承体系Wrapper是最顶级的父类AbstractWrapper继......
  • Linux nohup 命令详解
    文章目录Linux`nohup`命令详解基本语法`nohup`工作原理实用示例示例1:运行一个脚本并保持后台执行示例2:指定输出文件示例3:结合`sleep`命令使用`jobs`和`bg`管理后台进程使用`ps`和`kill`管理进程常见的`nohup`参数结合`nohup`和`cron`注意事项结论......
  • Linux rm命令详解
    文章目录Linux`rm`命令详解基本语法常用参数详解常见用法和示例注意事项实践示例结论参数表格Linuxrm命令详解rm(remove)命令用于删除文件或目录,是Linux系统中最常用的文件管理命令之一。rm命令具有强大的功能,可以删除单个文件、多个文件,甚至递归删除整个目录......