一、详解

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);

HttpUtils 详解的更多相关文章

  1. (转载)实例详解Android快速开发工具类总结

    实例详解Android快速开发工具类总结 作者:LiJinlun 字体:[增加 减小] 类型:转载 时间:2016-01-24我要评论 这篇文章主要介绍了实例详解Android快速开发工具类总结的相关 ...

  2. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  3. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  4. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  5. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  6. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  7. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  8. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

  9. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  10. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

随机推荐

  1. pytorch-a2c-ppo-acktr-gail 算法代码

    地址: https://github.com/ikostrikov/pytorch-a2c-ppo-acktr-gail

  2. 机器人的运动控制是否可以引入生物学信息,生物学信息是否可以辅助机器人的智能控制算法的训练:《Robotic prosthetic ankles improve 'natural' movement, stability》

    相关内容: Robotic prosthetic ankles improve 'natural' movement, stability 看了上面的论文的介绍(内容没看到,不是open access ...

  3. 如何使用Python环境下的2D经典游戏仿真器(openai推出的)retro库运行游戏"刺猬索尼克" (SonicTheHedgehog-Genesis)

    很多资料上都有使用游戏仿真器(openai推出的)retro库运行游戏"刺猬索尼克"  (SonicTheHedgehog-Genesis),但是均没有给出详细的安装该款游戏的步骤 ...

  4. 【转载】 解决VSCode运行或调试python文件无反应的问题

    ---------------- 版权声明:本文为CSDN博主「姜行者」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn. ...

  5. MySQL 优化慢查询

    查询以SELECT 语句的形式执行数据库中的所有查找操作.调整这些语句是重中之重,无论是实现动态网页的亚秒响应时间,还是缩短数小时生成大量夜间报告的时间. 此外SELECT语句,进行查询调谐技术也适用 ...

  6. [rCore学习笔记 024]多道程序与协作式调度

    写在前面 本随笔是非常菜的菜鸡写的.如有问题请及时提出. 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 本节重 ...

  7. 【CDQ分治】三元环

    三元环 HDU - 7439 思路 考虑 \(3\) 个点的有向图,要么成环,要么有一个点入度为 \(2\) ,假设第 个点的入度为 \(d_i\),答案为 \(C_n^3-\sum\limits_{ ...

  8. quartz监控日志(二)添加监听器

    上一章介绍监控job有三种方案,其实还有一个简单方案是实现quartz的TriggerListener. 上次我也试了这个方案,但是由于操作错误,导致没有监控成功,所以才选择分析源码来实现代理进行监控 ...

  9. Maven经验分享(六)Jboss热部署

    jboss7的部署方式比较多的,如果使用maven构建和管理项目,那当然是使用jboss-as-maven-plugin插件来部署项目是最方便的了. pom.xml配置如下: <plugin&g ...

  10. CentOs7.3 配置基本信息查看

    1.基本信息查看(命令行) [root@localhost home]# CPU个数: [root@localhost home]# grep 'physical id' /proc/cpuinfo ...