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

Java Apache HttpComponents:org.Apache.http.client.ClientProtocolException,java,http,apache-httpcomponents,Java,Http,Apache Httpcomponents,所以我使用ApacheHttpComponents在java中处理http请求。 现在我想重用DefaultHttpClient,根据这个示例,应该有什么可能:。示例本身给出了一个ssl错误,因此我对其进行了一些建模和简化。现在我总是得到一个org.apache.http.client.ClientProtocolException 这是我的示例程序,基本上我只需要使用相同的DefaultHttpClient请求2个网页 import java.io.ByteArrayOutputStream;

所以我使用ApacheHttpComponents在java中处理http请求。 现在我想重用
DefaultHttpClient
,根据这个示例,应该有什么可能:。示例本身给出了一个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());
    }
}
当运行我的示例时,我得到以下错误

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
访问两个sperate域,我的问题已经得到了回答。

这可能是由于v4.2 BasicClient ConnectionManager中最近的一个bug影响了跨站点重定向。看

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

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

您使用的是哪个版本的HttpClient?这可能与最近一个影响跨站点重定向的错误有关:在我看来,这是同一个错误,我使用的是版本4.2。我所做的atm是在每个域上使用difrent DefaultHttpClient,它工作得很好,所以我将保持这种方式。谢谢你找到这个bug。