网站建设的技术可行性,房屋装修设计图,自己做的网站发布详细步骤,商城网站风格1. 介绍
Java中传统的RestTemplate 的主要问题在于不支持响应式流规范#xff0c;也就无法提供非阻塞式的流式操作。而WebClient是响应式、非阻塞的客户端#xff0c;属于Spring5中的spring-webflux库
2. 依赖
maven依赖
dependencygroupIdorg.springfra…1. 介绍
Java中传统的RestTemplate 的主要问题在于不支持响应式流规范也就无法提供非阻塞式的流式操作。而WebClient是响应式、非阻塞的客户端属于Spring5中的spring-webflux库
2. 依赖
maven依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-webflux/artifactId
/dependencygradle依赖
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方法(通用)
UriSpecRequestBodySpec uriSpec client.method(HttpMethod.POST);另外WebClient对象也提供了get、post、delete等方法
UriSpecRequestBodySpec 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获取请求的响应结果
MonoString 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);}
});MonoString response headersSpec.retrieve().bodyToMono(String.class);