IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> WebClient 增删改查一文搞定 -> 正文阅读

[网络协议]WebClient 增删改查一文搞定

点击上方蓝色字体,选择“设为星标”

回复”云原生“获取基础架构实践

cbf364cb5554ea170915735e89d0b72e.png

Webclient 使用场景

前面介绍了 什么是阻塞、非阻塞,以及对应的客户端库,非阻塞在高并发内存不足的情况下,还是一个不错的选择,当被访问者的服务响应很慢、或者自己在请求对方时,并不是很想知道对方返回的结果,都可以使用 Webclient 来进行非阻塞式请求。下面紧接着讲非阻塞客户端库 Webclient如何实现增删改查。

Webclient 的RestFul 请求

一、RESTful风格与HTTP method

熟悉RESTful风格的朋友,应该了解RESTful风格API使用HTTP method表达对资源的操作。

常用HTTP方法RESTful风格语义(操作)
POST新增、提交数据
DELETE删除数据
PUT更新、修改数据
GET查询、获取数据

下面我们就来讲下这些资源场景的使用方式。

POST

POST等常见使用如下方法:

  • block()阻塞获取响应结果的方法

  • subscribe()非阻塞异步结果订阅方法

  • retrieve()获取HTTP响应体,exchange()除了获取HTTP响应体,还可以获取HTTP 状态码、headers、cookies等HTTP报文信息。

  • 使用Mono接收单个对象的响应结果,使用Flux接收集合类对象的响应结果。

  • 占位符语法传参方式

模拟表单提交数据

public?void?testFormSubmit()?{

????MultiValueMap<String,?String>?map?=?new?LinkedMultiValueMap<>();
????map.add("username",?"damoin");
????map.add("UID",?"11024319902323");

????Mono<String>?mono?=?webClientBuilder.build().post()
????????????????????.uri("http://rest-service-service/add")
????????????????????.contentType(MediaType.APPLICATION_FORM_URLENCODED)
????????????????????.body(BodyInserters.fromFormData(map))
????????????????????.retrieve()
????????????????????.bodyToMono(String.class);

????System.out.println(mono.block());
}

如上所示,在提交表单的时候,需要说明表单数据类型,以及表单的具体数据,我们知道:常见的表单数据都是以map形式存在,在请求后要想获取响应返回,可以使用retrieve函数,同时可以借助Mono来对返回结果进行类型转换,如果是单个对象使用Mono,如果是集合流,可以使用Flux。同时,如果想要阻塞拿到返回结果的信息,可以通过block函数来处理。

传输对象以JSON数据形式发送
public?void?testPostJson()?{
????SysUser?user?=?new?SysUser();
????user.setRealName("dwdwdww");
????user.setPhone("32323232");
????Mono<String>?mono?=?webClientBuilder.build()
????????????????????.post()
????????????????????.uri("http://rest-service-service/add")
????????????????????.contentType(MediaType.APPLICATION_JSON)
????????????????????.bodyValue(user)
????????????????????.retrieve()
????????????????????.bodyToMono(String.class);

????System.out.println(mono.block());
????}

这里将传输的数据以Json格式来进行发送给对方,同样需要注明数据类型MediaType.APPLICATION_JSON,其它的函数都是跟上面一样。

模拟向服务端发送JSON字符串数据

如果有时候对方需要的不是一个JSON对象,可能是需要一个JSON字符串,那怎么办呢?

public?void?testPostJsonStr()?{
????String?jsonStr?=?"{\"realName\":?\"damon\",\"phone\":?\"32323232\"}";
????Mono<String>?mono?=?webClientBuilder.build().post()
????????????????????.uri("http://rest-service-service/add")
????????????????????.contentType(MediaType.APPLICATION_JSON)
????????????????????.body(BodyInserters.fromValue(jsonStr))
????????????????????.retrieve()
????????????????????.bodyToMono(String.class);

????//?输出结果
????System.out.println(mono.block());
}

此时,数据类型同样还是 MediaType.APPLICATION_JSON,但传输的是JSON串。

DELETE

使用 DELETE方法去删除资源,删除一个已经存在的资源,使用webClient的delete()方法。该方法会向URL代表的资源发送一个HTTP DELETE方法请求:

public?void?testDelete()??{
??webClientBuilder.build()
??.delete()
??.uri("http://rest-service-service/1");
}

PUT

修改一个已经存在的资源,使用webClient的put()方法。该方法会向URL代表的资源发送一个HTTP PUT方法请求:

public?void?testPut()?{
????????SysUser?user?=?new?SysUser();
????????user.setRealName("dwdwdww");
????????user.setPhone("32323232");

????????Mono<String>?mono?=?webClientBuilder.build()
????????????????????????.put()
????????????????????????.uri("http://rest-service-service/1")
????????????????????????.contentType(MediaType.APPLICATION_JSON)
????????????????????????.bodyValue(user).retrieve().bodyToMono(String.class);

????????System.out.println(mono.block());
}

这里以传json数据的格式来进行发送修改,修改完成后返回修改结果信息。

GET

新增完数据后,我们来查看数据对象,如果是一个对象数据的话,可以使用 Mono:

@GetMapping(value?=?"/getClientResByWebClient2",?produces?=?MediaType.TEXT_EVENT_STREAM_VALUE)
????public?Mono<String>?getClientResByWebClient2()?throws?Exception?{
?????????????Mono<String>?resp?=?webClientBuilder.build()
?????????????.get()
?????????????.uri("http://diff-ns-service-service/all/getService")
?????????????.retrieve().bodyToMono(String.class);
?????????????//.exchange().flatMap(clientResp?->?clientResp.bodyToMono(String.class));

????????????resp.subscribe(body?->?System.out.println(body));
????????????return?resp;
????}

如果是多个对象,那就是集合集,此时需要用Flux来获取:

public?void?testFlux()?{
????Flux<SysUser>?flux?=?webClientBuilder.build()
??????????????.get()
??????????????.uri("http://diff-ns-service-service/all")
??????????????.retrieve()
??????????????.bodyToFlux(SysUser.class);
??????List<SysUser>?li?=?flux.collectList().block();
??????assert?li?!=?null;
??????System.out.println("li集合元素数量:"?+?li.size());
}

下面给大家介绍一本好书《深入了解分布式事务》,该书在当当网目前销售火热,有原理加实战,感兴趣可以点击下方链接购买。

开源项目

??实践项目代码开源:https://gitee.com/damon_one/microservice-k8s

欢迎大家star、fork,欢迎联系我,一起学习。

号内回复“云原生”,获取云原生基础架构实践电子书

37c174e5cadf7c828ea0786449043001.png

云原生社区合肥站

云原生社区合肥站正式启动啦,欢迎Base合肥、关注云原生、长期从事云原生的同志们踊跃加入,云原生社区合肥站会因为你们的加入而变得更加美好~

详情参见Issue:https://github.com/cloudnativeto/community/issues/107

欢迎关注个站

8d250f0aa3108072f64dd714c3bb2750.png

往期回顾

微服务自动化部署CI/CD

如何利用k8s拉取私有仓库镜像

个站建设基础教程

ArrayList、LinkedList&nbsp;你真的了解吗?

大佬整理的mysql规范,分享给大家

如果张东升是个程序员

微服务架构设计之解耦合

浅谈负载均衡

Oauth2的认证实战-HA篇

Oauth2的授权码模式《上》

浅谈开发与研发之差异

浅谈&nbsp;Java&nbsp;集合&nbsp;|&nbsp;底层源码解析

基于 Sentinel 作熔断 | 文末赠资料

基础设施服务k8s快速部署之HA篇

今天被问微服务,这几点,让面试官刮目相看

Spring cloud 之多种方式限流(实战)

Spring cloud 之熔断机制(实战)

面试被问finally 和 return,到底谁先执行?

Springcloud Oauth2 HA篇

Spring Cloud Kubernetes之实战一配置管理

Spring Cloud Kubernetes之实战二服务注册与发现

Spring Cloud Kubernetes之实战三网关Gateway

8e7be42e051dfd0e1da04d2fb1d21412.gif

2cb6f7177985f763954ee32772a31ca2.gif

点击?"damon8.cn"?获取更好的阅读体验!

??给个「在看」,是对我最大的支持??
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-11-18 11:30:16  更:2021-11-18 11:30:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年7日历 -2024/7/3 22:40:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码