如何让RESTEasy使用系统Web代理?

时间:2015-03-16 18:06:26

标签: jax-rs resteasy apache-httpclient-4.x http-proxy

我在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代理?

0 个答案:

没有答案