HttpClient 4 - 如何捕获上次重定向 URL

2022-08-31 19:44:32

我有相当简单的HttpClient 4代码,它调用HttpGet来获取HTML输出。HTML返回的脚本和图像位置都设置为本地(例如),所以我需要调用URL来使它们成为绝对()现在出现了问题 - 在调用期间可能会有一个或两个302重定向,因此原始URL不再反映HTML的位置。<img src="/images/foo.jpg"/><img src="http://foo.com/images/foo.jpg"/>

如何获取返回内容的最新URL,因为我可能(或可能没有)所有重定向?

我看了看,-找不到任何东西。HttpGet#getAllHeaders()HttpResponse#getAllHeaders()

已编辑:返回原始呼叫地址HttpGet#getURI()


答案 1

这将是当前 URL,您可以通过调用来获取

  HttpGet#getURI();

编辑:你没有提到你如何做重定向。这对我们有用,因为我们自己处理302。

听起来您正在使用DefaultRedirectHandler。我们曾经这样做过。获取当前 URL 有点棘手。您需要使用自己的上下文。以下是相关的代码片段,

        HttpGet httpget = new HttpGet(url);
        HttpContext context = new BasicHttpContext(); 
        HttpResponse response = httpClient.execute(httpget, context); 
        if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK)
            throw new IOException(response.getStatusLine().toString());
        HttpUriRequest currentReq = (HttpUriRequest) context.getAttribute( 
                ExecutionContext.HTTP_REQUEST);
        HttpHost currentHost = (HttpHost)  context.getAttribute( 
                ExecutionContext.HTTP_TARGET_HOST);
        String currentUrl = (currentReq.getURI().isAbsolute()) ? currentReq.getURI().toString() : (currentHost.toURI() + currentReq.getURI());

默认重定向对我们不起作用,所以我们改变了,但我忘记了问题是什么。


答案 2

在 HttpClient 4 中,如果您使用的是 或任何子类,这是推荐的方式(请参阅 的源代码):LaxRedirectStrategyDefaultRedirectStrategyDefaultRedirectStrategy

HttpContext context = new BasicHttpContext();
HttpResult<T> result = client.execute(request, handler, context);
URI finalUrl = request.getURI();
RedirectLocations locations = (RedirectLocations) context.getAttribute(DefaultRedirectStrategy.REDIRECT_LOCATIONS);
if (locations != null) {
    finalUrl = locations.getAll().get(locations.getAll().size() - 1);
}

自 HttpClient 4.3.x 起,上述代码可以简化为:

HttpClientContext context = HttpClientContext.create();
HttpResult<T> result = client.execute(request, handler, context);
URI finalUrl = request.getURI();
List<URI> locations = context.getRedirectLocations();
if (locations != null) {
    finalUrl = locations.get(locations.size() - 1);
}

推荐