HttpUtils 详解

一、详解

1.1 介绍

现如今的 Web 项目,由服务端向外发起网络请求的场景,基本上随处可见!

传统情况下,在服务端代码里访问 http 服务时,一般会使用 JDK 的 HttpURLConnection 或者 Apache 的 HttpClient,不过这种方法使用起来太过繁琐,而且 api 使用起来非常的复杂,还得操心资源回收。

1.2 什么是 HttpUtils?
  • HttpUtils 是 Solon 提供的进行远程调用客户端
  • HttpUtils 提供了很多远程调用的方法,能够大大提高客户端的编写效率。 HttpUtils 接口实现了 HttpURLConnection 的适配(默认),以及 OkHttp 的适配。
  • 官网地址: solon-net-httputils
1.3 引入依赖
xml 复制代码
<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon-net-httputils</artifactId>
</dependency>

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

java 复制代码
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请求
java 复制代码
@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请求)

java 复制代码
@Test
public void testGet(){
    //请求地址
    String url = "http://localhost:8080/testGet";
 
    //发起请求,直接返回对象
    Result result = HttpUtils.http(url).getAs(Result.class);
    System.out.println(result.toString());
带参的get请求(使用占位符号传参)
java 复制代码
@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 信息。

java 复制代码
@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方法测试
java 复制代码
@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

java 复制代码
@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,顺带加上文件上传

java 复制代码
@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

java 复制代码
@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

java 复制代码
@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 高级用法

获取响应(用完要关闭)

java 复制代码
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;或者自己定义。

java 复制代码
FuryBytesSerializer serializer = new FuryBytesSerializer();

Result body = HttpUtils.http("http://localhost:8080/book")
                       .serializer(serializer)
                       .bodyOfBean(book)
                       .postAs(Result.class);
相关推荐
何苏三月1 分钟前
设计模式 - 单例模式(懒汉式、饿汉式、静态内部类、枚举)
java·单例模式
Renas_TJOvO5 分钟前
排序算法汇总
java·数据结构·算法
秋恬意15 分钟前
Java 反射机制详解
java·开发语言
爱上语文23 分钟前
LeetCode每日一题
java·算法·leetcode
ღ᭄ꦿ࿐Never say never꧂31 分钟前
重生之我在Java世界------学工厂设计模式
java·设计模式·简单工厂模式·应用场景
尘浮生44 分钟前
Java项目实战II基于Spring Boot的火锅店管理系统设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·微信小程序·旅游
wrx繁星点点44 分钟前
桥接模式:解耦抽象与实现的利器
android·java·开发语言·jvm·spring cloud·intellij-idea·桥接模式
羊小猪~~1 小时前
C/C++语言基础--C++模板与元编程系列二类模板、全特化、偏特化、编译模型简介、实现简单Vetctor等…………)
java·c语言·开发语言·c++·visual studio code·visual studio
0_1_bits1 小时前
【系统设计】深入理解HTTP缓存机制:从Read-Through缓存到HTTP缓存的交互流程
网络协议·http·缓存
l138494274511 小时前
C语言储存变量 java循环语句和循环跳转
java·c语言·开发语言·算法