2011-10-22 51 views
1

是否有可能使用HttpClient从URL捕获完整的重定向历史记录?HTTPClient - 捕获所有重定向列表

举例来说,我们有URL-A,它重定向到URL-B,它最终将我们发送到URL-C,是否有方法可以捕获URL A,B和C?

最明显的方法是手动寻找在头部的位置标记,并停止当我们到达一个HTTP 200这个心不是一个简单的过程,因为我们需要寻找圆形重定向等等...

现在我假设的线沿线的东西:

HttpContext context = new BasicHttpContext(); 
    HttpResponse response = hc.execute(httpget, context); 
    //..... 
    for(URI u : ((RedirectLocations)context.getAttribute(DefaultRedirectStrategy.REDIRECT_LOCATIONS)).getAll()){ 
       System.out.println(u); 
    } 

将用于该用途的情况下工作?

回答

3

HttpClient支持自定义RedirectHandler。您可以覆盖默认实现(DefaultRedirectHandler)以捕获所有重定向。

DefaultHttpClient hc = new DefaultHttpClient(); 

HttpGet httpget = new HttpGet("http://google.com"); 
HttpContext context = new BasicHttpContext(); 


hc.setRedirectHandler(new DefaultRedirectHandler() { 
    @Override 
    public URI getLocationURI(HttpResponse response, 
           HttpContext context) throws ProtocolException { 

     //Capture the Location header here 
     System.out.println(Arrays.toString(response.getHeaders("Location"))); 

     return super.getLocationURI(response,context); 
    } 
}); 

HttpResponse response = hc.execute(httpget, context); 
+0

感谢您的示例!这是否意味着我在问题中使用的上述方法不会做我想做的事情,我应该实施自己的重定向处理程序。我们真的不需要做任何事情,只是得到所有重定向列表... – NightWolf

+0

我重复使用了我所做的一切。我无法获得您所指的某个课程的适当依赖关系。我会说简单地测试它。谷歌是你的用例的一个例子。 (google.com - > www.google.com - > www.google。?)或者做一个快速测试服务器。 – h3xStream

+0

感谢您使用Google进行测试的想法。测试上述方法,它似乎可以正常工作,但也许它更安全(并且更灵活)与您的方法一致。 – NightWolf