精讲响应式WebClient第3篇-POST、DELETE、PUT方法使用
本文是精讲响应式WebClient第3篇,前篇的blog访问地址如下:
一、RESTful风格与HTTP method
熟悉RESTful风格的朋友,应该了解RESTful风格API使用HTTP method表达对资源的操作。
| 常用HTTP方法 | RESTful风格语义(操作) |
|---|---|
| GET | 查询、获取数据 |
| POST | 新增、提交数据 |
| DELETE | 删除数据 |
| PUT | 更新、修改数据 |
在上一篇文章中我们已经为大家介绍了如何使用WebClient作为Http客户端发送GET请求与进行响应结果的接收。本节来为大家介绍POST、DELETE、PUT。
POST等其他的方法在与GET方法在使用如下方法的时候是一致的:
- block()阻塞获取响应结果的方法,subscribe()非阻塞异步结果订阅方法
- retrieve()获取HTTP响应体,exchange()除了获取HTTP响应体,还可以获取HTTP 状态码、headers、cookies等HTTP报文信息。
- 使用Mono接收单个对象的响应结果,使用Flux接收集合类对象的响应结果。
- 占位符语法传参方式
所以想了解以上信息,请去参考: 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方法详解。 本文只介绍POST、DELETE、PUT在使用过程中与GET不一样的地方。
为了方便后续开发测试,首先介绍一个网站给大家。JSONPlaceholder是一个提供免费的在线REST API的网站,我们在开发时可以使用它提供的url地址测试下网络请求以及请求参数。或者当我们程序需要获取一些模拟数据、模拟图片时也可以使用它。
二、Post请求发送JSON字符串、对象、表单数据
2.1.使用Post方法向服务端发送JSON字符串数据
public class OtherTest {
//创建webClient
private WebClient webClient = WebClient.builder()
.baseUrl("http://jsonplaceholder.typicode.com")
.build();
@Test
public void testPostJsonStr() {
// 提交给服务端的JSON字符串
String jsonStr = "{\"userId\": 1,\"title\": \"zimugtest\",\"body\": \"字母哥进行测试\"}";
// 发送请求
Mono<String> mono = webClient
.post() // POST 请求
.uri("/posts") // 请求路径
.contentType(MediaType.APPLICATION_JSON) //JSON数据类型
.body(BodyInserters.fromValue(jsonStr)) //JSON字符串数据
.retrieve() // 获取响应体
.bodyToMono(String.class); //响应数据类型转换
// 输出结果
System.out.println(mono.block());
}
}
响应结果打印如下,"http://jsonplaceholder.typicode.com/posts/1" 服务的请求数据就是响应数据。响应结果同样是一个JSON字符串:

2.2.将对象以JSON数据形式发送服务端
@Test
public void testPostJson() {
//构建请求发送对象
PostDTO postDTO = new PostDTO();
postDTO.setUserId(110);
postDTO.setTitle("zimug-test");
postDTO.setBody("字母哥进行Post测试");
//发送请求
Mono<PostDTO> mono = webClient
.post() // 发送POST 请求
.uri("/posts") //服务请求路径,基于baseurl
.contentType(MediaType.APPLICATION_JSON) //以JSON数据格式
.bodyValue(postDTO) //发送请求体,对象形式
.retrieve() // 获取响应体
.bodyToMono(PostDTO.class); //响应数据类型转换
// 输出结果
System.out.println("=====" + mono.block());
}
响应结果打印如下,使用PostDTO接收响应结果。因为 "http://jsonplaceholder.typicode.com/posts/1" 服务的请求数据就是响应数据。打印结果是PostDTO对象的toString()方法

2.3.POST模拟表单数据提交
@Test
public void testFormSubmit() {
//表单数据参数设置
MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add("title", "zimug-test");
map.add("body", "字母哥进行测试");
// 发送请求
Mono<String> mono = webClient
.post() // 发送POST 请求
.uri("/posts") // 请求路径
.contentType(MediaType.APPLICATION_FORM_URLENCODED) //表单数据类型
.body(BodyInserters.fromFormData(map)) //表单数据
.retrieve() // 获取响应体
.bodyToMono(String.class); //响应数据类型转换
// 输出结果
System.out.println(mono.block());
}
}
因为使用字符串的方式接受响应结果,所以输出和《2.1.使用Post方法向服务端发送JSON字符串数据》输出结果是一样的。
三、使用 DELETE方法去删除资源
删除一个已经存在的资源,使用webClient的delete()方法。该方法会向URL代表的资源发送一个HTTP DELETE方法请求。
@Test
public void testDelete() {
// 发送Delete请求
webClient.delete().uri("/posts/1"); // 请求路径
}
在前面章节测试类的基础上,写如上代码的测试用例。上面代码含义为删除posts列表里面的第1个帖子。
四、使用PUT方法去修改资源
修改一个已经存在的资源,使用webClient的put()方法。该方法会向URL代表的资源发送一个HTTP PUT方法请求。
@Test
public void testPut() {
//要修改的数据对象
PostDTO postDTO = new PostDTO();
postDTO.setId(1);
postDTO.setBody("字母哥进行Put测试");
Mono<PostDTO> mono = webClient
.put()
.uri("/posts/1") //服务请求路径,基于baseurl
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(postDTO) //发送请求体
.retrieve() // 获取响应体
.bodyToMono(PostDTO.class); //响应数据类型转换
// 输出结果
System.out.println("=====" + mono.block());
}
上面代码RESTful风格语义是:修改posts列表里面的第1个帖子。输出结果如下,是修改数据之后的结果:

欢迎关注我的博客,里面有很多精品合集
- 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。
- 《手摸手教你学Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《实战前后端分离RBAC权限管理系统》
- 《实战SpringCloud微服务从青铜到王者》
- 《VUE深入浅出系列》
精讲响应式WebClient第3篇-POST、DELETE、PUT方法使用的更多相关文章
- 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方法详解
本文是精讲响应式WebClient第2篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 在上一篇文章为大家介绍了响应式IO模型和WebClient的基本 ...
- 精讲响应式WebClient第4篇-文件上传与下载
本文是精讲响应式WebClient第4篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方 ...
- 精讲响应式WebClient第5篇-请求超时设置与异常处理
本文是精讲响应式WebClient第5篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方 ...
- 精讲响应式WebClient第6篇-请求失败自动重试机制,强烈建议你看一看
本文是精讲响应式WebClient第6篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方 ...
- 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法
笔者在之前已经写了一系列的关于RestTemplate的文章,如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层HT ...
- 小书MybatisPlus第7篇-代码生成器的原理精讲及使用方法
本文是本系列文章的第七篇,前6篇访问地址如下: 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查 小书MybatisPlus第2篇-条件构造器的应用及总结 小书Mybatis ...
- 小书MybatisPlus第8篇-逻辑删除实现及API细节精讲
本文为Mybatis Plus系列文章的第8篇,前7篇访问地址如下: 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查 小书MybatisPlus第2篇-条件构造器的应用及总 ...
- 响应式Spring Cloud初探
响应式Spring Cloud初探 分类:工程原文链接:The Road to Reactive Spring Cloud作者: JOSH LONG译者: helloworldtang日期:JUNE ...
- 浅谈响应式Web设计与实现思路
是否还在为你的应用程序适配PC端,移动端,平板而苦苦思索呢,是否在寻找如何一套代码适配多终端方式呢,是否希望快速上手实现你的跨终端应用程序呢,是的话,那就看过来吧,本文阐述响应式UI设计相关理论基础, ...
随机推荐
- Git常用命令及方法大全
下面是我整理的常用 Git 命令清单.几个专用名词的译名如下. Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 本地 ...
- 交通网最短路径长 dp c++
// // Created by Arc on 2020/4/26. // /* * 城市交通线路,单向通行,道路之间可能有不通,每条连同的路之间都有相应的费用 * 求从起点到终点的最小费用 * * ...
- JVM笔记-GC常用参数设置
GC常用参数 -Xmn -Xms -Xmx -Xss 年轻代 最小堆 最大堆 栈空间, -Xms -Xmx 一般设置成一样大小, -XX:+UseTLAB 使用TLAB,默认打开 -XX:+Print ...
- Django学习路26_转换字符串大小写 upper,lower
在 urls 中注册 url(r'getstr',views.getstr) 在 views.py 中添加函数 def getstr(request): string = 'abc' string_2 ...
- PHP usort() 函数
------------恢复内容开始------------ 实例 使用用户自定义的比较函数对数组 $a 中的元素进行排序:Sort the elements of the $a array usin ...
- pagehelper的使用和一些坑!
[toc] ##1.1 pagehelper介绍和使用 PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件. 原本以为分页插件,应该是很简单的,然而PageHelper比我想象 ...
- 错误记录:MIME type may not contain reserved characters
最近遇到个问题,随手记录一下! 新做了一个项目,要通过HTTP请求发送ZIP文件到OSS平台,但上传过程中,总是出现下面错误提示: 初步判定,应该是包冲突原因!于是,分析MIME-TYPE获取源码发现 ...
- JDK8的Stream操作
原文:https://mp.weixin.qq.com/s/N2zor5RzuHHTHQLHWVBttg 作者:思海同学 好好学java 其他资料:https://mp.weixin.qq.com/ ...
- 利用Data Vault对数据仓库进行建模(二)
写在前面 本篇先不讨论Data Vault其本身,因为不见得所有人都接受这个.但是里边有一些很不错的东西跟主流的数据仓库方法是有共同点的,所以这里主要讨论这些共同的方法,在笔者看来,无论是Kimbal ...
- Mybais面试题(一)
1.对于Hibernate和MyBatis的区别与利弊,谈谈你的看法 Hibernate与MyBatis的对比: 1.MyBatis非常简单易学,与Hibernate相对较复杂,门槛较高; ...