在 to 的迁移过程spring-web
中spring-reactive-web
,我们被HTTP proxy
at WebClient
builder 方法的实现阻塞了。
我们之前已经尝试过下面的代码片段,在How can I support an HTTP Proxy using Spring 5 WebClient? .
WebClient.Builder currentWebClient = WebClient.builder();
if (StringUtils.isNotBlank(customRequest.getConnectionMap().get(GatewayConstants.PROXY_HOST))) {
HttpClient httpClient = HttpClient.create()
.tcpConfiguration(tcpClient ->
tcpClient.proxy(proxy -> proxy.type(ProxyProvider.Proxy.HTTP).host(customRequest.getConnectionMap().get(GatewayConstants.PROXY_HOST)).port(Integer.valueOf(customRequest.getConnectionMap().get(GatewayConstants.PROXY_PORT)))));
ReactorClientHttpConnector connector = new ReactorClientHttpConnector(httpClient);
currentWebClient = currentWebClient.clientConnector(connector);
}
对于上面提到的需要启用 TLS 的代理支持的代码。它尝试使用 HTTP-Connect 方法建立连接,对于我们的情况,我们得到了status: 403 Forbidden
,因为我们现在没有 https 支持。要禁用 httpClient 的 HTTPS 功能,我什至尝试过noSSL()
,但它对我不起作用,
HttpClient httpClient = HttpClient.create()
.tcpConfiguration(tcpClient ->
tcpClient
.noSSL()
...
无论我尝试从 HTTP 客户端启用还是禁用 SSL 部分,网络活动时间线看起来都是一样的,我的意思是对于所有情况,当我使用代理时它都会调用 HTTP CONNECT 方法。
下面的代码看起来不错,可以帮助我们很好地调用 API,但没有找到任何将HTTP_PROXY (Without HTTP CONNECT method call)
配置与其关联的标准方法。
WebClient.Builder currentWebClient = WebClient.builder();
Mono<CustomHttpResponse> response = WebClient.builder().build()
.method(HttpMethod.GET)
.uri(url)
.exchange()
.flatMap(r -> r.bodyToMono(String.class).flatMap(b -> {
customHttpResponse.setBodyMap(convertToMap(customRequest, b));
return Mono.just(customHttpResponse);
}))
.timeout(Duration.ofMillis(10000))
.doOnRequest(r -> logger.info("BACKEND_CALL start"))
.doOnError(r -> logger.info("BACKEND_CALL ERROR"));
在这里,我们正在寻找一种使用 WebClient 实现 HTTP 调用机制的标准方法,该
GET
方法使用 WebClient 考虑特定于域的, , ,POST
用于PUT
某些后端调用。DELETE
SOCKET_TIMEOUT
CONNECTION_TIMEOUT
HTTP_PROXY (Without HTTP CONNECT method call)
Number of RETRY
对于依赖部分,我们的 WebClient 的有效版本来自,
Gradle: org.springframework:spring-web:5.1.7.RELEASE
如果您对此有任何进一步的疑问,请随时在下面发表评论。