Во время миграции 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, когда я использую прокси.
Код ниже выглядит хорошо и помогает нам вызывать 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-вызовов для HTTP-методов GET
, POST
, PUT
и DELETE
с использованием WebClient с учетом доменных SOCKET_TIMEOUT
, CONNECTION_TIMEOUT
, HTTP_PROXY (Without HTTP CONNECT method call)
, Number of RETRY
для некоторых внутренних вызовов.
Что касается зависимостей, действующая версия нашего веб-клиента исходит из Gradle: org.springframework:spring-web:5.1.7.RELEASE
.
Пожалуйста, не стесняйтесь комментировать ниже, если у вас есть какие-либо дополнительные вопросы, относящиеся к этому.