在Apache HttpComponents中获取重定向的URL

时间:2012-06-24 09:54:26

标签: java url redirect apache-httpcomponents

我正在使用Apache HttpComponents获取某些已抓取网址的网页。其中许多网址实际上会重定向到不同的网址(例如,因为它们已使用网址缩短程序进行处理)。除了下载内容之外,我还想解析最终的URL(即提供下载内容的URL),甚至更好地解析重定向链中的所有URL。

我一直在查看API文档,但没有任何线索,我可以挂钩。任何提示都将不胜感激。

2 个答案:

答案 0 :(得分:2)

一种方法是通过设置relevant parameter来关闭自动重定向处理,并通过检查3xx响应并从响应“位置”标题中手动提取重定向位置来自行完成。

答案 1 :(得分:1)

这是使用Apache HttpComponents如何做到的a full demo

重要细节

您需要像这样扩展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收集spy.history deque中的URI,因为它会自动重定向:

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);