2

在 to 的迁移过程spring-webspring-reactive-web,我们被HTTP proxyat WebClientbuilder 方法的实现阻塞了。

我们之前已经尝试过下面的代码片段,在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某些后端调用。DELETESOCKET_TIMEOUTCONNECTION_TIMEOUTHTTP_PROXY (Without HTTP CONNECT method call)Number of RETRY

对于依赖部分,我们的 WebClient 的有效版本来自, Gradle: org.springframework:spring-web:5.1.7.RELEASE

如果您对此有任何进一步的疑问,请随时在下面发表评论。

4

0 回答 0