2013-02-15 61 views
4

我的代码(下面)试图获取从重定向的服务器返回的最终URL。只要URL具有http方案,它就可以正常工作。当我想用不同的方案返回一个URL时,我的问题就出现了。最终,我希望在某些情况下返回市场:// url或其他应用程序启动计划,因为这是针对Android的,我希望启动Intents。所以这就让我尽可能检索最终的http url,但是当最终的url是market时//它会抛出异常(java.lang.IllegalStateException:Scheme'market'未注册),然后getURI没有提供那个,它会提供之前的任何东西。使用非常规方案获取重定向请求的最终URL

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()); 

现在,我可以只注册市场://作为一个方案,但我不想硬编码事先什么有效的方案是,我只是希望它接受他们,并返回他们为所欲为是。

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

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

+0

“URLConnection”的快速测试适用于我。你打算使用它吗? – BalusC 2013-02-15 00:56:19

+0

哦,是的。我会给你一个镜头。 – Turnsole 2013-02-15 17:08:51

+0

好的。我发布了一个答案。 – BalusC 2013-02-15 17:26:01

回答

2

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

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

connection.getHeaderField(“location”)对我而言始终为空。我尝试插入connection.connect(),但没有运气。 – Turnsole 2013-02-16 00:02:00

+0

有趣的事情......如果我将setInstanceFollowRedirects更改为false,则它会提供“location”的重定向值。显然,该位置是重定向标题的一部分,如果它自动遵循重定向,它将不会得到它? (我的线索在这里:http://stackoverflow.com/questions/3786161/cant-get-response-header-location-using-javas-urlconnection。) – Turnsole 2013-02-27 20:43:40

+0

存在多个重定向的问题。我可以得到第一个重定向,但由于它没有跟随到最后,我无法得到最后一个。 – Turnsole 2013-02-27 20:54:53