当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring 5 WebClient支持HTTP代理?

苏华藏
2023-03-14

我正在使用Spring 5 WebClient。我想知道是否可以将其配置为使用HTTP代理,或者是否有方法更改其默认配置以使用HTTP代理。

共有3个答案

司空坚
2023-03-14

在这里分享最近的经验

步骤1:定义代理环境变量

-Dhttp.proxyHost=<proxyHost>
-Dhttp.proxyPort=8080
-Dhttps.proxyHost=<proxyHost>
-Dhttps.proxyPort=8080
-Dhttps.nonProxyHosts=localhost

webClient上配置代理

@Configuration
public class WebClientConfiguration {    
 @Bean
 public WebClient webClient() {
     return WebClient.builder() //
             .defaultHeader(ACCEPT, APPLICATION_JSON_VALUE) //
             .clientConnector(new ReactorClientHttpConnector(httpClient())) //
             .build();
 }

 private HttpClient httpClient() {
     return HttpClient //
             .create() //
             .proxyWithSystemProperties();
 }

}

设置Spring云代理属性(在应用程序启动中)

static {
   String nonProxyHosts = System.getProperty("http.nonProxyHosts");
   if (nonProxyHosts != null) {
     String regexProxyList = nonProxyHosts.replaceAll("\\.", "\\\\.").replaceAll("\\/", "\\\\/").replaceAll("\\*", ".\\*");
     System.setProperty("spring.cloud.gateway.httpclient.proxy.non-proxy-hosts-pattern", regexProxyList);
 }
 String proxyHost = System.getProperty("https.proxyHost");
 String proxyPort = System.getProperty("https.proxyPort");
 if (proxyHost != null && proxyPort != null) {
     System.setProperty("spring.cloud.gateway.httpclient.proxy.host", proxyHost);
     System.setProperty("spring.cloud.gateway.httpclient.proxy.port", proxyPort);
 }
}
顾亦
2023-03-14

“tcpConfiguration”已弃用。所以改用这部分代码。

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

    ReactorClientHttpConnector connector = new ReactorClientHttpConnector(httpClient);

    WebClient webClient =  WebClient.builder().clientConnector(connector).build();
公良琛
2023-03-14

这是底层客户端库应该支持的东西。

使用ReactorNetty时,您可以执行以下操作:

HttpClient httpClient = HttpClient.create()
            .tcpConfiguration(tcpClient ->
                    tcpClient.proxy(proxy -> proxy.type(ProxyProvider.Proxy.HTTP).host("myproxyhost")));
ReactorClientHttpConnector connector = new ReactorClientHttpConnector(httpClient);
WebClient client = WebClient.builder().clientConnector(connector).build();
 类似资料:
  • 我发现javamail只支持袜子。有什么解决方案可以支持http代理吗?

  • 我们能同时使用spray-json支持https://doc.akka.io/docs/akka-http/current/common/json-support.html和XML支持https://doc.akka.io/docs/akka-http/current/common/xml-support.html吗 我尝试了以下方法,通过使用JsonProtocols和ScalaXmlSuppo

  • 问题内容: 我有一个对象,希望在JSON中作为RESTful资源使用。我已经启用了Jersey的JSON POJO支持(在web.xml中): 但是,当我尝试访问资源时,出现以下异常: 我要提供的类并不复杂,它只有一些公共final字段和一个设置所有这些的构造函数。字段是所有字符串,基元,与此类似的类或它们的列表(我尝试使用普通列表而不是通用List ,但无济于事)。有谁知道给什么?谢谢! Jav

  • 问题内容: 我有一个使用restify模块创建的REST api,我想允许跨域资源共享。最好的方法是什么? 问题答案: 您必须将服务器设置为设置跨源标头。不知道是否有内置的使用功能,所以我写了自己的功能。 我是从本教程中找到的。http://backbonetutorials.com/nodejs-restify-mongodb- mongoose/

  • 我有一个简单的Java程序,它使用SpringWebClient发送多个请求。每个都返回一个mono,我使用的是response。subscribe()以检查结果。 但是,我的主执行线程在处理所有请求之前完成,除非我添加一个长线程。睡眠()。 对于CompletableFutures,您可以使用:CompletableFuture。allOf(期货)。join(); 有没有办法等待所有单声道的完成

  • 一个好的HTTP缓存策略可以极大地提高一个web应用的性能及客户端的体验。谈到HTTP缓存,它主要是与HTTP的响应头'Cache-Control'相关,其次另外的一些响应头比如'Last-Modified'和'ETag'等也会起一定的作用。 HTTP的响应头'Cache-Control'主要帮助私有缓存(比如浏览器端缓存)和公共缓存(比如代理端缓存)了解它们应该如果缓存HTTP响应,以便后用。