【问题标题】:Malformed reply from SOCKS server when using OkHttpClient使用 OkHttpClient 时来自 SOCKS 服务器的格式错误的回复
【发布时间】:2020-09-05 09:15:59
【问题描述】:

我正在使用 feign 客户端在 Java 中发送 REST 请求,它工作得非常好,但是当另外使用 OkHttpClient 时,我收到一条错误消息

Caused by: feign.RetryableException: Malformed reply from SOCKS server executing GET

我确定了导致此错误的代码行

OkHttpClient.Builder builder = new OkHttpClient.Builder();
...
builder.proxy(new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(socksProxyHost, socksProxyPort)));

但是,由于我既需要 OkHttpClient 又需要使用 feign 客户端发送请求,我不能只删除它,而是必须找到解决方法。只要我通过 feign 发送请求并在之后将它们设置回来,有没有办法重置代理设置?我尝试将默认代理服务器设置为 null 使用

proxySelector.setDefault(null)

但不幸的是,这并没有解决我的问题。

感谢您的帮助!

【问题讨论】:

    标签: java rest okhttp socks spring-cloud-feign


    【解决方案1】:

    创建两个 OkHttpClient 实例,一个配置了代理,一个没有配置。

    builder.proxy(Proxy.NO_PROXY);
    

    如果您使用 OkHttpClient.newBuilder() 从另一个客户端创建一个客户端,他们将共享一个 ExecutorService 和其他资源。

    【讨论】:

      【解决方案2】:

      我通过分配一个新的 ProxySelector 而不是实际的代理解决了这个问题。在覆盖 select 方法时,我确保代理列表对于使用 feign 客户端发送的请求为空:

       ProxySelector proxySelector = new ProxySelector() {
                  @Override
                  public List<Proxy> select(URI uri) {
                      if (uri.toString().contains("HOST_NAME")) {
                          return List.of();
                      }
                      return List.of(
                              new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(socksProxyHost, socksProxyPort)));
                  }
      
                  @Override
                  public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
      
                  }
              };
              builder.proxySelector(proxySelector);
      

      【讨论】:

        猜你喜欢
        • 2013-12-06
        • 1970-01-01
        • 2013-01-18
        • 1970-01-01
        • 2018-01-07
        • 2014-09-06
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多