当前位置: 首页 > news >正文

WebClient学习

1. 介绍

Java中传统的RestTemplate 的主要问题在于不支持响应式流规范,也就无法提供非阻塞式的流式操作。而WebClient是响应式、非阻塞的客户端,属于Spring5中的spring-webflux库

2. 依赖

maven依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

gradle依赖

dependencies {compile 'org.springframework.boot:spring-boot-starter-webflux'
}

3. 使用

  1. WebClient实例创建

方式一:使用create方法创建

WebClient client = WebClient.create();

也可以创建的时候指定base URI

WebClient client = WebClient.create("http://localhost:8080");

方式二:最常用的方式是使DefaultWebClientBuilder

WebClient client = WebClient.builder().baseUrl("http://localhost:8080").defaultCookie("cookieKey", "cookieValue").defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .defaultUriVariables(Collections.singletonMap("url", "http://localhost:8080")).build();

方式三:创建WebClient实例并指定超时时间

  • 可以通过ChannelOption.CONNECT_TIMEOUT_MILLIS** option** 指定连接超时时间
  • 可以通过 ReadTimeoutHandler** **和WriteTimeoutHandler设置读和写的超时时间
  • 可以通过responseTimeout设置响应超时时间
HttpClient httpClient = HttpClient.create().option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000).responseTimeout(Duration.ofMillis(5000)).doOnConnected(conn -> conn.addHandlerLast(new ReadTimeoutHandler(5000, TimeUnit.MILLISECONDS)).addHandlerLast(new WriteTimeoutHandler(5000, TimeUnit.MILLISECONDS)));WebClient client = WebClient.builder().clientConnector(new ReactorClientHttpConnector(httpClient)).build();

2) 准备请求——指定Method

第一种方式:使用WebClient对象的method方法(通用)

UriSpec<RequestBodySpec> uriSpec = client.method(HttpMethod.POST);

另外,WebClient对象也提供了get、post、delete等方法

UriSpec<RequestBodySpec> uriSpec = client.post();
  1. 准备请求——指定URL

使用uri方法

RequestBodySpec bodySpec = uriSpec.uri("/resource");

使用UriBuilder函数

RequestBodySpec bodySpec = uriSpec.uri(uriBuilder -> uriBuilder.pathSegment("/resource").build());

使用URI实例

RequestBodySpec bodySpec = uriSpec.uri(URI.create("/resource"));
  1. 准备请求——指定方法体

最常见是直接使用bodyValue方法

RequestHeadersSpec<?> headersSpec = bodySpec.bodyValue("data");

通过响应式Publisher指定

RequestHeadersSpec<?> headersSpec = bodySpec.body(Mono.just(new Foo("name")), Foo.class);

通过BodyInserters工具类指定

RequestHeadersSpec<?> headersSpec = bodySpec.body(BodyInserters.fromValue("data"));

通过BodyInserters响应式Publisher指定

RequestHeadersSpec headersSpec = bodySpec.body(BodyInserters.fromPublisher(Mono.just("data")),String.class);

当传递的请求体是一个 MultiValueMap 对象时,WebClient 默认发起的是表单提交

LinkedMultiValueMap map = new LinkedMultiValueMap();
map.add("key1", "value1");
map.add("key2", "value2");
RequestHeadersSpec<?> headersSpec = bodySpec.body(BodyInserters.fromMultipartData(map));
  1. 准备请求——指定Headers

可以通过header方法设置请求的Header

ResponseSpec responseSpec = headersSpec.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).accept(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML).acceptCharset(StandardCharsets.UTF_8).ifNoneMatch("*").ifModifiedSince(ZonedDateTime.now()).retrieve();
  1. 获取请求的响应

我们可以通过exchangeToMono/exchangeToFlux o或者 retrieve获取请求的响应结果

Mono<String> response = headersSpec.exchangeToMono(response -> {if (response.statusCode().equals(HttpStatus.OK)) {return response.bodyToMono(String.class);} else if (response.statusCode().is4xxClientError()) {return Mono.just("Error response");} else {return response.createException().flatMap(Mono::error);}
});
Mono<String> response = headersSpec.retrieve().bodyToMono(String.class);

相关文章:

WebClient学习

1. 介绍 Java中传统的RestTemplate 的主要问题在于不支持响应式流规范&#xff0c;也就无法提供非阻塞式的流式操作。而WebClient是响应式、非阻塞的客户端&#xff0c;属于Spring5中的spring-webflux库 2. 依赖 maven依赖 <dependency><groupId>org.springfra…...

「计算机控制系统」6. 直接设计法

特殊类型系统的最小拍无差设计 一般系统的最小拍无差设计 最小拍控制器的工程化改进 Dahlin算法 文章目录 特殊类型系统的最小拍无差设计理论分析典型输入函数的最小拍无差系统 一般系统的最小拍无差设计有波纹最小拍无差设计无波纹最小拍无差设计 最小拍控制器的工程化改进针对…...

什么是JWT?

起源 需要了解一门技术&#xff0c;首先从为什么产生开始说起是最好的。JWT 主要用于用户登录鉴权&#xff0c;所以我们从最传统的 session 认证开始说起。 session认证 众所周知&#xff0c;http 协议本身是无状态的协议&#xff0c;那就意味着当有用户向系统使用账户名称和…...

STM32—0.96寸OLED液晶显示

本文主要介绍基于STM32F103的0.96寸的OLED液晶显示&#xff0c;详细关于0.96寸OLED液晶屏幕的介绍可参考这篇博客&#xff1a;https://blog.csdn.net/u011816009/article/details/130119426 一、简介 OLED被称为有机激光二极管&#xff0c;也被称为有机激光显示&#xff0c;O…...

Mysql的简介和选择

文章目录 前言一、为什么要使用数据库 数据库的概念为什么要使用数据库二、程序员为什么要学习数据库三、数据库的选择 主流数据库简介使用MySQL的优势版本选择四、Windows 平台下安装与配置MySQL 启动MySQL 服务控制台登录MySQL命令五、Linux 平台下安装与配置MySQL总结 前言…...

3D视觉之深度相机方案

随着机器视觉&#xff0c;自动驾驶等颠覆性的技术逐步发展&#xff0c;采用 3D 相机进行物体识别&#xff0c;行为识别&#xff0c;场景 建模的相关应用越来越多&#xff0c;可以说 3D 相机就是终端和机器人的眼睛。 3D 相机 3D 相机又称之为深度相机&#xff0c;顾名思义&…...

Mysql列的完整性约束详解(主键约束)

文章目录 前言一、设置表字段的主键约束&#xff08;PRIMARY KEY&#xff0c;PK&#xff09; 1.单字段主键2.多字段主键总结 前言 完整性约束条件是对字段进行限制&#xff0c;要求用户对该属性进行的操作符合特定的要求。如果不满足完整性约束条件&#xff0c;数据库系统将不再…...

母婴市场竞争激烈,如何通过软文营销脱颖而出

如今&#xff0c;随着宝宝数量增加以及人们对孩子的重视程度的增加&#xff0c;母婴市场愈发火爆。然而&#xff0c;母婴行业的竞争也越来越激烈&#xff0c;企业需要不断开拓新市场才能生存。在这样的情况下&#xff0c;软文营销成为了母婴企业拓展市场的一种有效方式。 首先&…...

java--线程池

目录 1.线程池概 2 为什么要使用线程池 1创建线程问题 2解决上面两个问题思路&#xff1a; 3线程池的好处 4线程池适合应用场景 3 线程池的构造函数参数 1.corePoolSize int 线程池核心线程大小 2.maximumPoolSize int 线程池最大线程数量 3.keepAliveTime long 空闲…...

asp.net765数码手机配件租赁系统

员工部分功能 1.员工登录&#xff0c;员工通过自己的账号和密码登录到系统中来&#xff0c;对租赁信息进行管理 2.配件查询&#xff0c;员工可以查询系统内的配件信息 3.客户信息管理&#xff0c;员工可以管理和店内有业务往来的客户信息 4.配件租赁&#xff0c;员工可以操作用…...

有关态势感知(SA)的卷积思考

卷积是一种数学运算&#xff0c;其本质是将两个函数进行操作&#xff0c;其中一个函数是被称为卷积核或滤波器的小型矩阵&#xff0c;它在另一个函数上滑动并产生新的输出。在计算机视觉中&#xff0c;卷积通常用于图像处理和特征提取&#xff0c;它可以通过滤波器对输入图像进…...

Docker快速部署springboot项目

有很多开发者在项目部署过程中都会遇到一些繁琐的问题&#xff0c;比如打包、上传、部署等。而使用Docker可以非常方便地解决这些问题。在本文中&#xff0c;将详细讲解如何使用IDEA中的docker打包插件&#xff0c;将代码打包并直接发布到服务器上。这样&#xff0c;我们就可以…...

Linux命令rsync增量同步目录下的文件

业务场景描述 最近遇到一个问题&#xff0c;需要编写相应的Linux命令&#xff0c;增量同步/var/mysql里的所有文件到另外一个目录/opt/mysql&#xff0c;但是里面相关的日志文件xx.log是不同步的&#xff0c;这个场景&#xff0c;可以使用rsync来实现 什么是rsync命令&#x…...

项目管理---(1)项目管理一般知识

一、项目管理一般知识 1.1 项目的一般知识 1.1.1 项目的定义&#xff1a; 项目是为创造独特的产品、服务或成果而进行的临时性工作。 1.1.2 项目的目标&#xff1a; 项目的目标包括成果性目标和约束性目标。 成果性目标&#xff1a;指通过项目开发出满足客户要求的产品、系…...

超过50多个热门的免费可用 API 分享

今天吃什么&#xff1a;随机返回一顿美味食物&#xff0c;解决你今天吃什么的难题。万年历&#xff1a;获取公历日期对应的农历、农历节日节气、天干地支纪年纪月纪日、生肖属相、宜忌、星座等信息。支持查询未来15天。笑话大全&#xff1a;各种最新、最及时的幽默、搞笑段子&a…...

记一次死锁问题

最近在做一个需求&#xff0c;碰到了死锁的问题&#xff0c;记录下解决问题的过程 背景 这个需求要改动一个接口&#xff0c;我这边称为A接口&#xff0c;原先的逻辑是A接口内部会调用c方法&#xff0c;c方法是一个dubbo方法&#xff0c; 现在需要再A接口里添加调用B方法&…...

Bean 作⽤域和⽣命周期

目录 1.lombok 1.1 1.添加依赖&#xff1a;&#xff08;pom.xml&#xff09; 1.2 在实体类上使用lombok提供的注解 1.3 安装插件 2. Bean 的 6 种作⽤域&#xff08;Scope&#xff09; 2.1 singleton&#xff08;默认模式&#xff09; 2.2 prototype&#xff08;原型模式…...

SVN通过备份、过滤、再导入的方式彻底删除废弃目录

文章目录 前言简要步骤操作示例总结 前言 SVN占用的空间随着项目版本迭代越来越大&#xff0c;因为保存了历史记录中的各个版本&#xff0c;所以即使本地把废弃的目录删掉提交&#xff0c;也不会释放出多余的空间&#xff0c;大概率因为操作删除增加了一个版本号&#xff0c;使…...

golang支持优雅关闭和core错误记录

#经过测试&#xff0c;不能使用 ENTRYPOINT ["/modapi/modapi", "1>> /dev/null","2>> ./logs/stderr.log"]&#xff0c;原因是虽然这种方案可以 #保证modapi命令为1号程序&#xff0c;能够接收到os的signal信号。但是如果程序core了…...

Basics of Container Isolation 容器隔离的实现原理

目录 容器隔离的实现原理 1. 使用cgroups实现资源隔离 自定义一个cgroup 设置进程的内存使用 启动一个docker 容器&#xff0c;观察cgroup的创建情况 2. 使用Namespaces进行资源分区 namespace继承关系引发的问题 3. 结合来使用Namespaces 和chroot 4. 结论 参考文档…...

80C166/C167芯片内部RAM执行代码技术详解

1. 80C166/C167芯片内部RAM执行代码的技术解析在嵌入式系统开发中&#xff0c;有时我们需要将特定代码从ROM复制到芯片内部RAM执行。这种需求常见于需要改变总线模式的场景&#xff0c;比如在Siemens 80C166/C167微控制器上切换8位/16位模式或改变总线复用配置。根据Siemens官方…...

2026武汉美术艺考培训机构排名出炉,家长择校必看!

在美育教育持续受重视的背景下&#xff0c;美术高考成为众多学子升学的重要渠道。武汉作为华中美育核心城市&#xff0c;美术培训机构已超 300 家&#xff0c;市场竞争激烈。据湖北省教育考试院 2026 年湖北美术联考数据&#xff0c;全省美术考生超 1.8 万人&#xff0c;武汉占…...

用高效证书管理加固企业数字边界

在当今企业 IT 基础架构的运行中&#xff0c;数字证书已经成为不可或缺的重要组成部分。这在很大程度上源于企业逐渐将 HTTPS 作为默认的数据传输方式&#xff0c;以实现更加安全的通信环境。从安全与隐私角度来看&#xff0c;这无疑是一项积极的改变&#xff0c;因为数据在传输…...

【顶级EI复现】考虑用户行为基于扩散模型的电动汽车充电场景生成( Python + PyTorch代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 &#x1f381…...

机器学习生产化:从Notebook到可运维ML服务的实战路径

1. 项目概述&#xff1a;当模型走出笔记本&#xff0c;真正开始“呼吸”现实空气 你有没有经历过这样的时刻&#xff1a;Jupyter Notebook里所有指标都闪闪发亮&#xff0c;AUC 0.92&#xff0c;F1 0.87&#xff0c;交叉验证稳如泰山&#xff1b;业务方点头签字&#xff0c;上线…...

Burp Suite客户端证书失效的三大TLS握手决策点解析

1. 这不是证书问题&#xff0c;是Burp对TLS握手阶段的“信任错位”你有没有遇到过这样的场景&#xff1a;在Burp Suite里配置好了Client SSL Certificate&#xff0c;也勾选了“Use client certificate for all requests”&#xff0c;可一发请求&#xff0c;目标服务器就直接返…...

DeepSeek-R1 vs Qwen2.5 vs Claude-3:17项硬指标对比,谁才是2024高性价比AI模型黑马?

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek性价比优势分析 DeepSeek 系列模型&#xff08;如 DeepSeek-V2、DeepSeek-Coder、DeepSeek-MoE&#xff09;在开源大模型生态中展现出显著的性价比优势&#xff0c;尤其在推理效率、训练成本与下游任务…...

全栈开发的核心技能:掌握这4个技术,成为全栈工程师

对于很多深耕测试领域多年的软件测试从业者来说&#xff0c;“转全栈开发”早已不是一个陌生的方向——无论是为了突破职业瓶颈&#xff0c;还是为了打通测试到开发的链路&#xff0c;提升自己的端到端交付能力&#xff0c;抑或是拓展职业选择的边界&#xff0c;全栈工程师都是…...

免费编辑《上古卷轴》和《辐射》游戏3D模型的终极指南:NifSkope完整教程

免费编辑《上古卷轴》和《辐射》游戏3D模型的终极指南&#xff1a;NifSkope完整教程 【免费下载链接】nifskope A git repository for nifskope. 项目地址: https://gitcode.com/gh_mirrors/ni/nifskope 想要为你的《上古卷轴&#xff1a;天际》角色设计一套独特的盔甲吗…...

taotoken多模型聚合平台为matlab开发者提供稳定ai能力

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 taotoken多模型聚合平台为matlab开发者提供稳定ai能力 对于使用MATLAB进行数据分析、仿真建模或算法开发的工程师和研究人员而言&a…...