Apache HttpComponents:org.apache.http.client.ClientProtocolException

所以我使用apache HttpComponents来处理java中的http请求。 现在我想重用DefaultHttpClient ,这个例子应该是可能的: http ://wiki.apache.org/HttpComponents/QuickStart。 示例本身给出了一个ssl错误,因此我对其进行了修改和简化。 现在我总是得到一个org.apache.http.client.ClientProtocolException

这是我的示例程序,基本上我只是使用相同的DefaultHttpClient请求2个网页。

 import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; public class ClientFormLogin { public static void main(String[] args) throws Exception { DefaultHttpClient httpclient = new DefaultHttpClient(); //Handle first request. HttpGet httpget = new HttpGet("http://tweakers.net/nieuws/82969/amazon-nederland-opent-digitale-deuren-in-september.html"); HttpResponse response = httpclient.execute(httpget); System.out.println("Execute finished"); HttpEntity entity = response.getEntity(); String page = readInput(entity.getContent()); System.out.println("Request one finished without problems!"); //Handle second request HttpGet httpost = new HttpGet("http://gathering.tweakers.net/forum/list_messages/1506977/last"); response = httpclient.execute(httpost); entity = response.getEntity(); page = readInput(entity.getContent()); System.out.println("Request two finished without problems!"); } private static String readInput(InputStream in) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); byte bytes[] = new byte[1024]; int n = in.read(bytes); while (n != -1) { out.write(bytes, 0, n); n = in.read(bytes); } return new String(out.toString()); } } 

当runnig我的例子我得到了下面的错误

 Request one finished without problems! Exception in thread "main" org.apache.http.client.ClientProtocolException at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:909) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784) at ClientFormLogin.main(ClientFormLogin.java:29) Caused by: org.apache.http.HttpException: Unable to establish route: planned = {}->http://gathering.tweakers.net; current = {}->http://tweakers.net at org.apache.http.impl.client.DefaultRequestDirector.establishRoute(DefaultRequestDirector.java:842) at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:645) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:480) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906) ... 3 more 

任何人都可以给我一些指示我如何解决这个问题,除了为每个请求使用一个新的DefaultHttpClient


编辑

我刚刚发现如果我留在同一个域中我没有遇到任何问题:

 page1: 'http://tweakers.net/nieuws/82969/amazon-nederland-opent-digitale-deuren-in-september.html' page2: 'http://tweakers.net/nieuws/82973/website-nujij-belandt-op-zwarte-lijst-google-door-malware.html' 

如果我到达,我没有问题:

 page1: 'http://tweakers.net/nieuws/82969/amazon-nederland-opent-digitale-deuren-in-september.html' page2: 'http://gathering.tweakers.net/forum/list_messages/1506076/last' 

我收到了错误。

Ofc我在发布问题后一分钟就看到了这一点。 除非有人能告诉我如何使用相同的DefaultHttpClient进行2个特定域名,我的问题已经得到解答。

这可能是由于v4.2 BasicClientConnectionManager中最近的一个错误影响了跨站点重定向。 见http://issues.apache.org/jira/browse/HTTPCLIENT-1193 。

根据维护者的说法,一个临时解决方法是使用SingleClientConnManager或PoolingClientConnectionManager。 也许是这样的:

 ClientConnectionManager connManager = new PoolingClientConnectionManager(); DefaultHttpClient httpclient = new DefaultHttpClient(connManager); ...