HttpUtils 详解
一、详解
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() -> StringgetAs(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() -> StringpostAs(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 详解的更多相关文章
- (转载)实例详解Android快速开发工具类总结
实例详解Android快速开发工具类总结 作者:LiJinlun 字体:[增加 减小] 类型:转载 时间:2016-01-24我要评论 这篇文章主要介绍了实例详解Android快速开发工具类总结的相关 ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- Git初探--笔记整理和Git命令详解
几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...
- Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
- Node.js npm 详解
一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...
随机推荐
- window系统多用户登录软件——ASTER——终端共享器——网络终端机
Windows系统除了Server版其他的都是单用户系统,但是其实Windows系统都是内置支持多用户的,只不过除了Server版本以外的系统版本都是将多用户登录功能屏蔽掉了,如果我们可以解除掉win ...
- 【转载】 CV往哪卷?李飞飞指出三颗「北极星」:具身智能,视觉推理和场景理解
原文地址: https://news.cnblogs.com/n/720105/ 新智元报道 编辑:LRS ============================================== ...
- 哈希基础知识学习-python版
哈希 哈希表 根据key直接进行访问的无序数据结构,复杂度为O(1) 哈希表的实现---字典 初始化 d1 = dict() 查找 #使用中括号[]进行查找,括号内为特定的键, 键-值 dic = { ...
- 部署MatterMost-开源团队协作平台
前言 之前的文章有提到部署 MatterMost 的事. 本文来记录一下. 关于 MatterMost MatterMost 有点像 Slack 这种协作工具,而且和 GitLab 的集成还不错,正好 ...
- 瑞芯微-I2S | ALSA基础-3
针对音频设备,linux内核中包含了两类音频设备驱动框架: OSS:开放声音系统 包含dsp和mixer字符设备接口,应用访问底层硬件是直接通过sound设备节点实现的: ALSA:先进linux声音 ...
- You are currently using minified code outside of NODE_ENV === 'production'. This means that you are running a slower development build of Redux.
You are currently using minified code outside of NODE_ENV === 'production'. This means that you are ...
- 掌握Java面向对象OOP篇(一)
掌握面向对象OOP篇(一) 边学边记 -- OOP(Object Orientated Programing) 1. 为什么要引入面向对象? 原因:封装.继承.多态 举个例子理解面向对象代码的好处: ...
- 零基础学习人工智能—Python—Pytorch学习(八)
前言 本文介绍卷积神经网络的上半部分. 其实,学习还是需要老师的,因为我自己写文章的时候,就会想当然,比如下面的滑动窗口,我就会想当然的认为所有人都能理解,而实际上,我们在学习的过程中之所以卡顿的点多 ...
- IDEA - ruoyi - srpingboot - 离线运行
前提:有项目对应的repository文件,RY的DB配置正常(mysql新增schema ry, 执行 /sql下的sql文件,同步调整ruoyi-admin下的application-druid. ...
- 第1章-JSP 简介
目录 什么是JSP 安装配置JSP运行环境 JSP页面 JSP页面简介 设置Web服务目录 JSP运行原理 JSP 与Java Servlet的关系 HTML与JavaScript 什么是JSP ★ ...