我在Java 8中使用JAX-RS作为RESTful客户端,使用RESTEasy 3.0.10.Final作为Windows 7 64位上的实现。 RESTEasy反过来使用Apache httpclient 4.2.6。
我单独learned如何为httpclient手动指定Web代理,因此如果在我的代码中我使用专门配置的ResteasyClientBuilder
手动配置ApacheHttpClient4Engine
,我的RESTEasy客户端连接正确使用代理人。
我的问题是我想使用java.net.useSystemProxies
系统属性,以便我的Java程序将使用Windows Internet Options中配置的任何代理,以便我的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)
其他人recommended在默认代理选择器中关闭SOCKS路由,这确实阻止了httpclient套接字被路由到系统代理---但是HTTP连接完全绕过代理,这会使代理失败目的
我猜这里httpclient只是要求一个套接字,Java看到系统代理并假设套接字连接是针对SOCKS代理的。我还猜想,即使Java套接字正常传递给Web代理,httpclient也不会知道任何关于它的内容,因此也不会看到HTTP请求的正确代理格式。或者httpclient会以某种方式看到java.net.useSystemProxies
已打开,并改变其请求?但是,它甚至会知道系统代理是否真的有效?
所以我在这里完全停滞不前。如果我打开java.net.useSystemProxies
并在Java中发出正常的HTTP请求,它们将使用系统配置的Web代理。 如何告诉RESTEasy / httpclient使用系统配置的Web代理?