Gar*_*son 5 jax-rs http-proxy resteasy apache-httpclient-4.x
我将 JAX-RS 用于 Java 8 中的 RESTful 客户端,RESTEasy 3.0.10.Final 作为 Windows 7 64 位上的实现。RESTEasy 反过来使用 Apache httpclient 4.2.6。
我单独学习了如何为 httpclient 手动指定 Web 代理,因此如果在我的代码中我ResteasyClientBuilder使用专门配置的手动配置 a ApacheHttpClient4Engine,我的 RESTEasy 客户端连接会正确使用代理。
我的问题是我想使用java.net.useSystemProxies系统属性,以便我的 Java 程序将使用在 Windows Internet 选项中配置的任何代理,以便我的 Java 程序可以与其他程序无缝协作,而不需要对其进行特殊配置。这适用于使用 Java 的原生 HTTP 连接的连接。但是 RESTEasy/Apache httpclient 显然打开了一个直接套接字并在低级别执行其 HTTP 通信。
当我告诉 Java 使用系统代理时,Java 确实将 httpclient 连接路由到代理。但出于某种原因,httpclient 认为它正在与 SOCKS 代理交谈——或者其他东西——并且请求超时:
java.net.SocketException: Can't connect to SOCKS proxy:Connection timed out: connect
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:429)
at java.net.Socket.connect(Socket.java:589)
at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:127)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:643)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:479)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
at org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.invoke(ApacheHttpClient4Engine.java:283)
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.invoke(ClientInvocation.java:407)
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocationBuilder.get(ClientInvocationBuilder.java:159)
Run Code Online (Sandbox Code Playgroud)
其他人建议在默认代理选择器中关闭 SOCKS 路由,这确实阻止了 httpclient 套接字被路由到系统代理——但是 HTTP 连接完全绕过了代理,这违背了目的。
我在这里猜测 httpclient 只是请求一个套接字,而 Java 看到系统代理并假设套接字连接用于 SOCKS 代理。我也猜想,即使 Java 套接字正常传递给 Web 代理,httpclient 也不会知道任何关于它的信息,因此不会看到 HTTP 请求的正确代理格式。或者 httpclient 会以某种方式看到它java.net.useSystemProxies被打开,并改变它的请求?但是它怎么知道系统代理是否真的有效呢?
所以我在这里完全停滞不前。如果我java.net.useSystemProxies在 Java 中打开并发出正常的 HTTP 请求,它们将使用系统配置的 Web 代理。如何告诉 RESTEasy/httpclient 使用系统配置的 Web 代理?
| 归档时间: |
|
| 查看次数: |
1642 次 |
| 最近记录: |