相关疑难解决方法(0)

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

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

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

我看着HttpGet#getAllHeaders()HttpResponse#getAllHeaders()-找不到任何东西.

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

java apache-httpclient-4.x

50
推荐指数
5
解决办法
5万
查看次数

301/302重定向无法在Android中运行(在不同版本中的工作方式不同)

使用URLConnection时,301重定向不起作用,甚至不Location使用getHeaderFields()显示标题.它是一个空白列表,除了较新的Android(我测试4.1并且它工作).它看起来像这样的东西已经被报道在默认浏览器在这里为好,但在我的测试中它的Android浏览器的工作.在旧的Android中是否有针对此错误的解决方法?

我试过了:

URLConnection conn = u.openConnection();
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
(conn).setInstanceFollowRedirects(true);
Run Code Online (Sandbox Code Playgroud)

但它仍然会返回一个空列表,除了较新的Android.

更新:这可能是一个相关的问题,有时似乎URLConnection甚至没有在某些情况下发送请求.(我在带有模拟器的电脑上查看了Wireshark).有办法解决这个错误吗?

更新:我尝试测试3xx重定向,重定向工作正常,但普通链接不适用于Ian的Cookie管理器.确保在openConnection之后直接调用setCookies时,它可以很好地工作:

        URL u = new URL(_url);
        ...
        int tries = 4;
        int code = 301;
        URLConnection conn = null;
        while (tries > 0 && code/100 == 3) {
            conn = null;
            conn = u.openConnection();
            _CM.setCookies(conn);
            ((HttpURLConnection)conn).setInstanceFollowRedirects(false);//Required
            code =((HttpURLConnection)conn).getResponseCode();
            if (code/100 == 3) {
                String loc = conn.getHeaderField("Location");
                u = new URL(loc);
            }
        }

        //conn.addRequestProperty("Accept-Encoding", "gzip");

        conn.connect();
        _CM.storeCookies(conn);
Run Code Online (Sandbox Code Playgroud)

真正奇怪的是,对于较新的Android(4.1模拟器),FollowRedirect行(注释为"必需")不是必需的.在较旧的Android(2.2)上,它会Connection Reset …

java redirect android urlconnection http-status-code-301

6
推荐指数
1
解决办法
5358
查看次数