0

Apache HttpComponentsを使用して、クロールされた URL の Web ページを取得しています。これらの URL の多くは、実際には別の URL にリダイレクトされます (たとえば、URL 短縮サービスで処理されているため)。コンテンツのダウンロードに加えて、最終 URL (つまり、ダウンロードしたコンテンツを提供した URL) を解決したいと考えています。さらに良いことに、リダイレクト チェーン内のすべての URL を解決したいと考えています。

私は API ドキュメントを調べてきましたが、どこにフックできるのか、手がかりがありませんでした。どんなヒントでも大歓迎です。

4

2 に答える 2

2

1 つの方法は、関連するパラメーターを設定して自動リダイレクト処理をオフにし、3xx 応答をチェックして手動で応答の "Location" ヘッダーからリダイレクトの場所を抽出することです。

于 2012-06-24T10:02:05.520 に答える
1

これは、Apache HttpComponents を使用してそれを行う方法の完全なデモです。

重要な詳細

DefaultRedirectStrategy次のように拡張する必要があります。

class SpyStrategy extends DefaultRedirectStrategy {
    public final Deque<URI> history = new LinkedList<>();

    public SpyStrategy(URI uri) {
        history.push(uri);
    }

    @Override
    public HttpUriRequest getRedirect(
            HttpRequest request,
            HttpResponse response,
            HttpContext context) throws ProtocolException {
        HttpUriRequest redirect = super.getRedirect(request, response, context);
        history.push(redirect.getURI());
        return redirect;
    }
}

expandメソッドは HEAD リクエストを送信します。これにより、リダイレクトが自動的に行われるclientため、deque で URI が収集spy.historyされます。

public static Deque<URI> expand(String uri) {
    try {
        HttpHead head = new HttpHead(uri);
        SpyStrategy spy = new SpyStrategy(head.getURI());
        DefaultHttpClient client = new DefaultHttpClient();
        client.setRedirectStrategy(spy);
        // FIXME: the following completely ignores HTTP errors:
        client.execute(head);
        return spy.history;
    }
    catch (IOException e) {
        throw new RuntimeException(e);
    }
}

次のように、リダイレクトの最大数を (デフォルトの 100 ではなく) 合理的な値に設定することができます。

        BasicHttpParams params = new BasicHttpParams();
        params.setIntParameter(ClientPNames.MAX_REDIRECTS, 5);
        DefaultHttpClient client = new DefaultHttpClient(params);
于 2013-05-16T01:14:36.610 に答える