Во время миграции spring-web
в spring-reactive-web
мы заблокировали реализацию HTTP proxy
в методе WebClient
.
Мы уже пробовали приведенный ниже фрагмент кода, на который ссылаются в Как я могу поддерживать HTTP-прокси с помощью 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. Чтобы отключить функции HTTPS из httpClient, я даже попытался noSSL()
, но у меня это не сработает,
HttpClient httpClient = HttpClient.create()
.tcpConfiguration(tcpClient ->
tcpClient
.noSSL()
...
Независимо от того, пытаюсь я включить или отключить часть SSL из клиента HTTP, временная шкала сетевой активности выглядитТо же самое, я имею в виду, что во всех случаях он вызывает метод HTTP CONNECT, когда я использую прокси.
![enter image description here](https://i.stack.imgur.com/83hxq.jpg)
Ниже код выглядит хорошо и помогает нам вызывать 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"));
Здесь мы ищем стандартный способ реализации механизма HTTP-вызовов для GET
, POST
, PUT
и DELETE
HTTP-методы с использованием WebClient, учитывающие специфику домена SOCKET_TIMEOUT
, CONNECTION_TIMEOUT
, HTTP_PROXY (Without HTTP CONNECT method call)
, Number of RETRY
для некоторых внутренних вызовов.
Для зависимой части - эффективная версиядля нашего веб-клиента: Gradle: org.springframework:spring-web:5.1.7.RELEASE
Пожалуйста, не стесняйтесь комментировать ниже, если у вас есть еще вопросы, относящиеся к нему.