4

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

所以这让我可以检索最终的 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。

4

1 回答 1

3

用于HttpURLConnection工作对我有用。当目标资源不是 HTTP 资源时,以下重定向无一例外地停止。

HttpURLConnection connection = (HttpURLConnection) new URL(mInitialUrl).openConnection();
connection.setInstanceFollowRedirects(true);
String location = connection.getHeaderField("location");
于 2013-02-15T17:25:47.723 回答