使用非常规方案获取重定向请求的最终URL

时间:2013-02-15 00:04:59

标签: java http apache-commons-httpclient

我的代码(下面)尝试从服务器返回的最终URL进行一些重定向。只要URL具有http方案,它就可以正常工作。当我想要返回具有不同方案的URL时,我的问题出现了。最终,我希望在某些情况下返回market:// url或其他应用程序启动方案,因为这是针对Android的,我想与他们一起启动Intent。

所以这让我得到了最终的http url,但是当最后的url是market://它会抛出异常(java.lang.IllegalStateException:Scheme'market'未注册),然后getURI没有不提供那个,它会提供之前的任何东西。

    DefaultHttpClient client = new DefaultHttpClient();
    HttpContext httpContext = new BasicHttpContext();
    HttpGet httpGet = new HttpGet(mInitialUrl);

    try {
        client.execute(httpGet, httpContext);
    } catch (IllegalStateException e) {
        e.printStackTrace();
    }

    // Parse out the final uri. 
    HttpHost currentHost = (HttpHost) httpContext.getAttribute(ExecutionContext.HTTP_TARGET_HOST);
    HttpUriRequest req = (HttpUriRequest) httpContext.getAttribute(ExecutionContext.HTTP_REQUEST);

    return (req.getURI().isAbsolute()) ? req.getURI().toString() : (currentHost.toURI() + req.getURI());

现在,我可以将market://注册为一个方案,但我不想事先对有效方案进行硬编码,我只是希望它接受它们并将它们返回给它们。

有什么想法吗?也许我甚至没有采取正确的方法。 (在这种情况下,更改服务器行为不是一个选项...我必须处理重定向。)

我希望有人可以告诉我如何让HttpClient忽略该方案,或者至少保留它试图访问的最终URI。

1 个答案:

答案 0 :(得分:3)

使用HttpURLConnection为我的工作。当目标资源不是HTTP资源时,以下重定向会毫无例外地停止。

HttpURLConnection connection = (HttpURLConnection) new URL(mInitialUrl).openConnection();
connection.setInstanceFollowRedirects(true);
String location = connection.getHeaderField("location");