2

そのため、Javaでhttpリクエストを処理するためにapacheHttpComponentsを使用します。DefaultHttpClientここで、この例に従って何が可能であるかを再利用したいと思います: http ://wiki.apache.org/HttpComponents/QuickStart 。例自体はsslエラーを出すので、私はそれを少し単純化して単純化しました。今、私はいつもorg.apache.http.client.ClientProtocolException

これが私のサンプルプログラムです。基本的には、同じを使用して2つのWebページを要求するだけDefaultHttpClientです。

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すべてのリクエストにnewを使用することを除いて、誰でもこの問題を解決する方法を教えてくれます。


編集

同じドメインにとどまっている場合は問題がないことがわかりました。

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'

エラーが発生します。

多くの場合、質問を投稿してから1分後にこれが表示されます。誰かが私が同じもので2つの異なるドメインに行く方法を教えてくれる場合を除いて、DefaultHttpClient私の質問はすでに答えられています。

4

1 に答える 1

5

これは、クロスサイトリダイレクトに影響を与えるv4.2BasicClientConnectionManagerの最近のバグが原因である可能性があります。http://issues.apache.org/jira/browse/HTTPCLIENT-1193を参照してください。

メンテナによると、一時的な回避策の1つは、SingleClientConnManagerまたはPoolingClientConnectionManagerを使用することです。おそらくこのようなもの:

ClientConnectionManager connManager = new PoolingClientConnectionManager();
DefaultHttpClient httpclient = new DefaultHttpClient(connManager);
...
于 2012-07-05T17:25:59.723 に答える