我的代码(下面)尝试从服务器返回的最终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。
答案 0 :(得分:3)
使用HttpURLConnection
为我的工作。当目标资源不是HTTP资源时,以下重定向会毫无例外地停止。
HttpURLConnection connection = (HttpURLConnection) new URL(mInitialUrl).openConnection();
connection.setInstanceFollowRedirects(true);
String location = connection.getHeaderField("location");