我正在使用Apache HttpComponents获取某些已抓取网址的网页。其中许多网址实际上会重定向到不同的网址(例如,因为它们已使用网址缩短程序进行处理)。除了下载内容之外,我还想解析最终的URL(即提供下载内容的URL),甚至更好地解析重定向链中的所有URL。
我一直在查看API文档,但没有任何线索,我可以挂钩。任何提示都将不胜感激。
答案 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);