Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HTTPClient-捕获所有重定向的列表_Java_Apache Httpclient 4.x - Fatal编程技术网

Java HTTPClient-捕获所有重定向的列表

Java HTTPClient-捕获所有重定向的列表,java,apache-httpclient-4.x,Java,Apache Httpclient 4.x,是否可以使用HttpClient从URL捕获完整的重定向历史记录 比如说,我们有一个URL-A,它重定向到URL-B,最终将我们发送到URL-C,有没有一种方法可以捕获URL A、B和C是什么 最明显的选择是手动查找标头中的位置标记,并在到达HTTP 200时停止。这不是一个简单的过程,因为我们需要寻找循环重定向等 现在我假设的是: HttpContext context = new BasicHttpContext(); HttpResponse response = hc.

是否可以使用HttpClient从URL捕获完整的重定向历史记录

比如说,我们有一个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);
    }

是否适用于此用例?

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

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

RedirectHandler
从4.1开始就不推荐使用 将使用重定向策略

我们可以覆盖两种方法
isRedirected
getRedirect
在您的情况下,您可以通过以下方式获得所有重定向:

final HttpClientContext clientContext = 
        HttpClientContext.adapt(context);
RedirectLocations redirectLocations = (RedirectLocations)
    clientContext.getAttribute(
        HttpClientContext.REDIRECT_LOCATIONS
    );

您可以在
getRedirect
中添加此代码。这也可以在
DefaultRedirectStrategy
类的
getLocationURI
方法中找到这段代码。

谢谢您的示例!这是否意味着我在问题中使用的上述方法不会实现我想要的,我应该实现自己的重定向处理程序。我们真的不需要做任何事情,只需要得到一个所有重定向的列表…我重用了我做的一些事情。我无法获得您引用的某个类的正确依赖项。我想说的是简单地测试一下。谷歌是你的用例的一个例子。(google.com->www.google.com->www.google.?)或做一个快速测试服务器。感谢您提出使用谷歌进行测试的想法。通过测试上述方法,它似乎可以正常工作,但使用您的方法可能更安全(更灵活)。看起来
hc.setRedirectHandler
在4.1.2中已被弃用。。。你知道这个过程现在应该是什么吗?你的第一个方法可能更好。它也比较短。