HttpClient 4 - 如何捕获最后的重定向 URL
我有相当简单的 HttpClient 4 代码,它调用 HttpGet 来获取 HTML 输出。 HTML 返回的脚本和图像位置全部设置为本地(例如 ),因此我需要调用 URL 将它们设置为绝对位置(< code>) 现在问题来了 - 在调用过程中可能会有一两个 302 重定向,所以原始 URL不再反映 HTML 的位置。
考虑到我可能(或可能没有)的所有重定向,如何获取返回内容的最新 URL?
我查看了 HttpGet#getAllHeaders()
和 HttpResponse#getAllHeaders()
- 找不到任何东西。
编辑:HttpGet#getURI()
返回原始调用地址
I have rather simple HttpClient 4 code that calls HttpGet to get HTML output. The HTML returns with scripts and image locations all set to local (e.g. <img src="/images/foo.jpg"/>
) so I need calling URL to make these into absolute (<img src="http://foo.com/images/foo.jpg"/>
) Now comes the problem - during the call there may be one or two 302 redirects so the original URL is no longer reflects the location of HTML.
How do I get the latest URL of the returned content given all the redirects I may (or may not) have?
I looked at HttpGet#getAllHeaders()
and HttpResponse#getAllHeaders()
- couldn't find anything.
Edited: HttpGet#getURI()
returns original calling address
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
这将是当前的 URL,您可以通过调用
EDIT 来获取它:您没有提到如何进行重定向。这对我们有用,因为我们自己处理 302。
听起来您正在使用 DefaultRedirectHandler。我们曾经这样做过。获取当前 URL 有点棘手。您需要使用自己的上下文。以下是相关的代码片段,
默认重定向对我们不起作用,因此我们进行了更改,但我忘记了问题是什么。
That would be the current URL, which you can get by calling
EDIT: You didn't mention how you are doing redirect. That works for us because we handle the 302 ourselves.
Sounds like you are using DefaultRedirectHandler. We used to do that. It's kind of tricky to get the current URL. You need to use your own context. Here are the relevant code snippets,
The default redirect didn't work for us so we changed but I forgot what was the problem.
在 HttpClient 4 中,如果您使用
LaxRedirectStrategy
或DefaultRedirectStrategy
的任何子类,这是推荐的方式(请参阅DefaultRedirectStrategy
的源代码): HttpClient 4.3.x,上面的代码可以简化为:
In HttpClient 4, if you are using
LaxRedirectStrategy
or any subclass ofDefaultRedirectStrategy
, this is the recommended way (see source code ofDefaultRedirectStrategy
) :Since HttpClient 4.3.x, the above code can be simplified as:
我在 HttpComponents 客户端文档 上找到了这个
I found this on HttpComponents Client Documentation
恕我直言,基于 ZZ Coder 解决方案的改进方法是使用 ResponseInterceptor 来简单地跟踪最后的重定向位置。这样您就不会丢失信息,例如在主题标签之后。如果没有响应拦截器,您就会丢失主题标签。示例: http://j.mp/OxbI23
使用它就像 ZZ Coder 的解决方案:
An IMHO improved way based upon ZZ Coder's solution is to use a ResponseInterceptor to simply track the last redirect location. That way you don't lose information e.g. after an hashtag. Without the response interceptor you lose the hashtag. Example: http://j.mp/OxbI23
use it just like ZZ Coder's solution:
我认为找到最后一个 URL 的更简单方法是使用 DefaultRedirectHandler。
使用此处理程序的代码:
I think easier way to find last URL is to use DefaultRedirectHandler.
Code to use this handler:
在 Android 2.3 版本中,仍然不支持以下重定向(HTTP 代码 302)。我刚刚阅读了位置标头并再次下载:
此处没有循环重定向保护,因此请小心。有关更多信息,请参阅博客 使用 AndroidHttpClient 遵循 302 重定向
In version 2.3 Android still do not support following redirect (HTTP code 302). I just read location header and download again:
No circular redirects protection here so be careful. More on by blog Follow 302 redirects with AndroidHttpClient
这就是我设法获取重定向 URL 的方法:
或者,如果您确定只有一个重定向位置,请执行以下操作:
This is how I managed to get the redirect URL:
Or, if you are sure that there is only one redirect location, do this: