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. webclient学习1.webclient是什么?

    1.webclient是什么? WebClient 软件包是 RT-Thread 自主研发的,基于 HTTP 协议的客户端的实现,它提供设备与 HTTP Server 的通讯的基本功能. 2.软件包功 ...

  2. vs2010 学习Silverlight学习笔记(11):数据与通信之WebClient

    概要: 基础知识终于学完了,我今天又从第一篇看到第十篇,发现明白了一些东西,还有忘记了部分东西.呵呵,咱不能猴子掰玉米,学了新的忘记旧的.要经常去复习,去用.这一篇是数据通信部分的第一篇,有些东西没接 ...

  3. SilverLight学习笔记--Silverlight中WebRequest通讯

    本文我们学习如何使用WebRequest类实现客户端和服务器端的通讯.      本例处理过程:在客户端,我们在文本框中输入任意文本,然后用POST方法向服务器端传递信息,服务器端收到从客户端传来的信 ...

  4. 分享Silverlight/WPF/Windows Phone一周学习导读(1月17日-1月23日)

    上周微软Silverlight团队发布"微软发布Silverlight Native Extensions 1.0 - 扩展OOB应用功能",对于Silverlight开发人员而言 ...

  5. 分享Silverlight/WPF/Windows Phone一周学习导读(10月1日-10月15日)

    分享Silverlight/WPF/Windows Phone一周学习导读(10月1日-10月15日) 本周Silverlight学习资源更新: [Silverlight入门系列]ListboxIte ...

  6. 分享Silverlight/WPF/Windows Phone一周学习导读(3月14日-3月19日)

    用了近一周的Windows Phone 7,作为长期使用iPhone的用户,刚使用WP7的确让人感觉挺生硬的,其中不乏先入为主的理由. 尽管如此,我还是非常喜欢Windows Phone 7个性界面, ...

  7. 分享Silverlight/WPF/Windows Phone一周学习导读(3月1日-3月5日)

    休假一个月,没有更新Silverlight/WPF/Windows Phone学习导读.从本周开始继续分享每周最新的Silverlight/WPF/Windows Phone开发学习导读. 本周Sil ...

  8. 利用WebClient类向服务器上载文件(转孟子的)

    利用WebClient类向服务器上载文件(转孟子的) 今天看了TERRYLEE老大的一篇写上传的.里面有个WEBCLIENT我就上网查了一下,找到孟子大人的一篇文章.感觉不错,就转了过来.大家一起学习 ...

  9. 分享Silverlight/Windows8/WPF/WP7/HTML5一周学习导读(5月6日-5月12日)

    分享Silverlight/Windows8/WPF/WP7/HTML5一周学习导读(5月6日-5月12日) 本周Silverlight学习资源更新 Beginning Silverlight 4 i ...

最新文章

  1. 数据库-SQL中like的用法
  2. Ubuntu配置远程访问的xrdp协议和teamviewer软件
  3. 初学Java ssh之Spring 第二篇
  4. LeetCode 1099. 小于 K 的两数之和(二分查找)
  5. php session作用,PHP中Session的作用
  6. java调用一个外部url_Spring Boot :访问外部接口
  7. 新建word 无法切换输入法_WORD系列-1认识与保存
  8. HTML5实践 -- 使用css装饰你的图片画廊
  9. 最新酷睿计算机配置,三款intel九代酷睿全系列组装电脑配置推荐 每一款CPU都支持超频...
  10. 算法四:回溯和分支界定
  11. 串口uart编程——基于imx6ull
  12. 网络操作系统和分布式系统区别简介
  13. Python 字符串格式化
  14. html:button按钮背景图片设置
  15. java代码自动回复_17.10.18 Java实现公众号关注自动回复图文
  16. 【视频开发】ONVIF客户端搜索设备获取rtsp地址开发笔记(精华篇)
  17. [RK3288][Android6.0] 调试笔记 --- Activity多次调用finish()引起的Warning
  18. 零基础小白学python之【贝壳房价爬取】(一)
  19. 《JavaSE-第二章》之基本数据类型与类型转换
  20. python中右对齐_Python rjust()字符串右对齐方法详解

热门文章

  1. 公网ipv6搭建文件服务器,IT之家学院:搭建自己的IPv6私有云
  2. Android动画之旅-Android动画基本介绍
  3. 北京内推 | 微软亚洲研究院机器学习组招聘强化学习方向研究型实习生
  4. 股份有限公司的章程包括哪些内容?
  5. 软件测试基础知识总结(一)
  6. AI(1)认知 人工智能、机器学习、神经网络、深度学习。
  7. 登山赛车2服务器正在维护什么意思,登山赛车2无法打开怎么办 登山赛车2登录不了解决方案...
  8. 清北学堂2019NOIP提高储备营DAY1
  9. 小学教师资格证笔试答题模板
  10. 计算机主机通常包不包括硬盘,计算机主机通常包括