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. 使用
- 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();
- 准备请求——指定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"));
- 准备请求——指定方法体
最常见是直接使用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));
- 准备请求——指定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();
- 获取请求的响应
我们可以通过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学习相关推荐
- webclient学习1.webclient是什么?
1.webclient是什么? WebClient 软件包是 RT-Thread 自主研发的,基于 HTTP 协议的客户端的实现,它提供设备与 HTTP Server 的通讯的基本功能. 2.软件包功 ...
- vs2010 学习Silverlight学习笔记(11):数据与通信之WebClient
概要: 基础知识终于学完了,我今天又从第一篇看到第十篇,发现明白了一些东西,还有忘记了部分东西.呵呵,咱不能猴子掰玉米,学了新的忘记旧的.要经常去复习,去用.这一篇是数据通信部分的第一篇,有些东西没接 ...
- SilverLight学习笔记--Silverlight中WebRequest通讯
本文我们学习如何使用WebRequest类实现客户端和服务器端的通讯. 本例处理过程:在客户端,我们在文本框中输入任意文本,然后用POST方法向服务器端传递信息,服务器端收到从客户端传来的信 ...
- 分享Silverlight/WPF/Windows Phone一周学习导读(1月17日-1月23日)
上周微软Silverlight团队发布"微软发布Silverlight Native Extensions 1.0 - 扩展OOB应用功能",对于Silverlight开发人员而言 ...
- 分享Silverlight/WPF/Windows Phone一周学习导读(10月1日-10月15日)
分享Silverlight/WPF/Windows Phone一周学习导读(10月1日-10月15日) 本周Silverlight学习资源更新: [Silverlight入门系列]ListboxIte ...
- 分享Silverlight/WPF/Windows Phone一周学习导读(3月14日-3月19日)
用了近一周的Windows Phone 7,作为长期使用iPhone的用户,刚使用WP7的确让人感觉挺生硬的,其中不乏先入为主的理由. 尽管如此,我还是非常喜欢Windows Phone 7个性界面, ...
- 分享Silverlight/WPF/Windows Phone一周学习导读(3月1日-3月5日)
休假一个月,没有更新Silverlight/WPF/Windows Phone学习导读.从本周开始继续分享每周最新的Silverlight/WPF/Windows Phone开发学习导读. 本周Sil ...
- 利用WebClient类向服务器上载文件(转孟子的)
利用WebClient类向服务器上载文件(转孟子的) 今天看了TERRYLEE老大的一篇写上传的.里面有个WEBCLIENT我就上网查了一下,找到孟子大人的一篇文章.感觉不错,就转了过来.大家一起学习 ...
- 分享Silverlight/Windows8/WPF/WP7/HTML5一周学习导读(5月6日-5月12日)
分享Silverlight/Windows8/WPF/WP7/HTML5一周学习导读(5月6日-5月12日) 本周Silverlight学习资源更新 Beginning Silverlight 4 i ...
最新文章
- 数据库-SQL中like的用法
- Ubuntu配置远程访问的xrdp协议和teamviewer软件
- 初学Java ssh之Spring 第二篇
- LeetCode 1099. 小于 K 的两数之和(二分查找)
- php session作用,PHP中Session的作用
- java调用一个外部url_Spring Boot :访问外部接口
- 新建word 无法切换输入法_WORD系列-1认识与保存
- HTML5实践 -- 使用css装饰你的图片画廊
- 最新酷睿计算机配置,三款intel九代酷睿全系列组装电脑配置推荐 每一款CPU都支持超频...
- 算法四:回溯和分支界定
- 串口uart编程——基于imx6ull
- 网络操作系统和分布式系统区别简介
- Python 字符串格式化
- html:button按钮背景图片设置
- java代码自动回复_17.10.18 Java实现公众号关注自动回复图文
- 【视频开发】ONVIF客户端搜索设备获取rtsp地址开发笔记(精华篇)
- [RK3288][Android6.0] 调试笔记 --- Activity多次调用finish()引起的Warning
- 零基础小白学python之【贝壳房价爬取】(一)
- 《JavaSE-第二章》之基本数据类型与类型转换
- python中右对齐_Python rjust()字符串右对齐方法详解
热门文章
- 公网ipv6搭建文件服务器,IT之家学院:搭建自己的IPv6私有云
- Android动画之旅-Android动画基本介绍
- 北京内推 | 微软亚洲研究院机器学习组招聘强化学习方向研究型实习生
- 股份有限公司的章程包括哪些内容?
- 软件测试基础知识总结(一)
- AI(1)认知 人工智能、机器学习、神经网络、深度学习。
- 登山赛车2服务器正在维护什么意思,登山赛车2无法打开怎么办 登山赛车2登录不了解决方案...
- 清北学堂2019NOIP提高储备营DAY1
- 小学教师资格证笔试答题模板
- 计算机主机通常包不包括硬盘,计算机主机通常包括