代理设置不适用于Spring WebClient

我下面的WebClient可以正常使用Internet连接,但不能通过我们的代理连接。

WebClient webClient = WebClient.builder()
        .baseUrl("https://targetsite.com")
        .build();

webClient.post()
    .uri("/service/serviceName")
    .body(BodyInserters.fromObject(reqData))
    .retrieve()
    .bodyToMono(WebServiceResponse.class)

不过,如果我按如下所述进行设置,则同一客户端正在通过代理工作,

HttpClient httpClient = HttpClient.create()
            .tcpConfiguration(tcpClient -> tcpClient
                .proxy(proxy -> proxy
                    .type(ProxyProvider.Proxy.HTTP)
                    .host("ourproxy.com")
                    .port(8080)));

ReactorClientHttpConnector connector = new ReactorClientHttpConnector(httpClient);

WebClient webClient = WebClient.builder()
        .clientConnector(connector)
        .baseUrl("https://targetsite.com")
        .build();

webClient.post()
    .uri("/service/serviceName")
    .body(BodyInserters.fromObject(reqData))
    .retrieve()
    .bodyToMono(WebServiceResponse.class)

但是,如果我使用System.setProperty("http.proxyHost","ourproxy.com");设置了相同的代理服务器详细信息 System.setProperty("http.proxyPort","8080"); 要么 JVM运行时参数-Dhttp.proxyHost=ourproxy.com -Dhttp.proxyPort=8080

WebClient webClient = WebClient.builder()
        .baseUrl("https://targetsite.com")
        .build();

System.setProperty("http.proxyHost","ourproxy.com");
System.setProperty("http.proxyPort","8080");

webClient.post()
    .uri("/service/serviceName")
    .body(BodyInserters.fromObject(reqData))
    .retrieve()
    .bodyToMono(WebServiceResponse.class)

调用失败,并带有UnknownHostException之类的

[04/11/2019 12:32:43.031 IST] DEBUG [reactor-http-epoll-3] [PooledConnectionProvider:254] - Creating new client pool [http] for targetsite.com:443
[04/11/2019 12:32:43.033 IST] DEBUG [reactor-http-epoll-3] [PooledConnectionProvider:254] - [id: 0xe4a0dc15] Created new pooled channel,now 0 active connections and 1 inactive connections
[04/11/2019 12:32:43.045 IST] DEBUG [reactor-http-epoll-3] [SslProvider:254] - [id: 0xe4a0dc15] SSL enabled using engine SSLEngineImpl and snI targetsite.com:443
[04/11/2019 12:32:43.046 IST] DEBUG [reactor-http-epoll-3] [BootstrapHandlers:254] - [id: 0xe4a0dc15] Initialized pipeline DefaultChannelPipeline{(reactor.left.sslHandler = io.netty.handler.ssl.SslHandler),(reactor.left.sslReader = reactor.netty.tcp.SslProvider$SslReadHandler),(BootstrapHandlers$BootstrapInitializerHandler#0 = reactor.netty.channel.BootstrapHandlers$BootstrapInitializerHandler),(SimpleChannelPool$1#0 = io.netty.channel.pool.SimpleChannelPool$1),(reactor.left.httpCodec = io.netty.handler.codec.http.HttpClientCodec),(reactor.left.decompressor = io.netty.handler.codec.http.HttpContentDecompressor),(reactor.right.reactiveBridge = reactor.netty.channel.ChannelOperationsHandler)}
[04/11/2019 12:32:43.165 IST] ERROR [reactor-http-epoll-2] [AbstractErrorWebExceptionHandler:117] - [13ebf1eb] 500 Server Error for HTTP POST "/service/serviceName"
java.net.UnknownHostException: targetsite.com: Name or service not known

请帮助,如果我通过JVM运行时参数或系统属性设置代理详细信息,为什么我的代码不起作用。

实际上,我想避免代码级代理设置。因此,请指导我纠正代码或方法,以便可以使用JVM运行时参数选项。

w509637JOB 回答:代理设置不适用于Spring WebClient

后来,当我向反应堆网络团队(https://github.com/reactor/reactor-netty/issues/887#issuecomment-549439355)提出此问题时,他们确认 reactor.netty.http.client.HttpClient 不支持系统属性。 >。唯一的选择是通过 tcpConfiguration 进行设置,我已经在问题中提到了它。所以我用这个话来结束这个问题。

谢谢大家

,

您需要在每个波纹管创建 HttpClient 实例时设置代理主机和端口。

HttpClient httpClient =
            HttpClient.create()
                    .proxy(proxy -> proxy.type(ProxyProvider.Proxy.HTTP)
                            .host(sasConfig.getProxyHost())
                            .port(Integer.parseInt(sasConfig.getProxyPort())));

ReactorClientHttpConnector conn = new ReactorClientHttpConnector(httpClient);

WebClient webClient = WebClient.builder().clientConnector(conn).build();
,

问题是默认情况下HttpClient将不使用Java VM代理设置。您需要明确地使其使用它们。因此,请尝试以下操作;

HttpClient httpClient = HttpClient.create()
            .useSystemProperties();

并使用该HttpClient创建WebClient,以编程方式或使用VM Args设置JVM的代理设置。

System.setProperty("http.proxyHost","ourproxy.com"); 
System.setProperty("http.proxyPort","8080"); 

-Dhttp.proxyHost=ourproxy.com -Dhttp.proxyPort=8080
本文链接:https://www.f2er.com/3168347.html

大家都在问