resttemplate - 用 webClient 替换 restTemplate
问题描述
我有一个控制器,用于RestTemplate
从多个休息端点获取数据。由于“RestTemplate”被阻塞,我的网页需要很长时间才能加载。为了提高性能,我打算RestTeamplate
用Spring WebClient
. 我目前使用的一种方法RestTemplate
如下。
public List<MyObject> getMyObject(String input){
URI uri = UriComponentsBuilder.fromUriString("/someurl")
.path("123456")
.build()
.toUri();
RequestEntity<?> request = RequestEntity.get(uri).build();
ParameterizedTypeReference<List<MyObject>> responseType = new ParameterizedTypeReference<List<MyObject>>() {};
ResponseEntity<List<MyObject>> responseEntity = restTemplate.exchange(request, responseType);
MyObject obj= responseEntity.getBody();
}
现在我想替换我上面的方法来使用WebClient
,但我是新手WebClient
,不知道从哪里开始。任何方向和帮助表示赞赏。
解决方案
为了帮助你,我给你举个例子,我们如何用 webClient 替换 restTemple。我希望你已经设置了你的 pom.xml
创建了一个配置类。
@Slf4j
@Configuration
public class ApplicationConfig {
/**
* Web client web client.
*
* @return the web client
*/
@Bean
WebClient webClient() {
return WebClient.builder()
.filter(this.logRequest())
.filter(this.logResponse())
.build();
}
private ExchangeFilterFunction logRequest() {
return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> {
log.info("WebClient request: {} {} {}", clientRequest.method(), clientRequest.url(), clientRequest.body());
clientRequest.headers().forEach((name, values) -> values.forEach(value -> log.info("{}={}", name, value)));
return Mono.just(clientRequest);
});
}
private ExchangeFilterFunction logResponse() {
return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> {
log.info("WebClient response status: {}", clientResponse.statusCode());
return Mono.just(clientResponse);
});
}
}
加上一个调用 WebClient 的服务类
@Component
@RequiredArgsConstructor
public class MyObjectService {
private final WebClient webClient;
public Mono<List<Object>> getMyObject(String input) {
URI uri = UriComponentsBuilder.fromUriString("/someurl")
.path("123456")
.build()
.toUri();
ParameterizedTypeReference<List<MyObject>> responseType = new ParameterizedTypeReference<List<MyObject>>() {
};
return this.webClient
.get()
.uri(uri)
.exchange()
.flatMap(response -> response.bodyToMono(responseType));
}
}
这将为您提供一个非阻塞 Mono List<MyObject>
,您还可以使用response.bodyToFlux(responseType)
我希望这将为您提供更多探索的基础。
推荐阅读
- excel - 计算不以 1 结尾的单元格?
- r - 有没有办法加速格式化表格从 R 到 excel 的写入?
- javascript - 令牌,无效的签名密钥
- python - 在 window.__INITIAL_STATE__ 中找不到属性,尽管它存在
- php - OpenCart - 无法更新管理仪表板
- angular7 - 是否可以针对两种不同的搜索条件(例如,医院和车库)进行谷歌地图搜索?
- keyboard-shortcuts - 什么是mac中删除光标留下的文本直到终端行开头的快捷方式
- angular-material - @angular 材质主题无法在浏览器上加载
- c# - 在门户中编写的 Azure 函数中包含 NuGet 包
- kubernetes - Kubernetes 大小考虑