Java 使用非常规方案获取重定向请求的最终URL
我的代码(如下)尝试从执行了一点重定向的服务器返回最终URL。只要URL具有http方案,它就可以正常工作。当我想用不同的方案返回URL时,问题就出现了。最终,在某些情况下,我希望返回一个market://url或其他应用程序发布方案,因为这是针对Android的,我想用它们开始尝试 因此,这让我能够检索最终的http url,但是当最终url为market://时,它抛出所看到的异常(java.lang.IllegalStateException:Scheme'market'not registered),然后getURI不提供该异常,它将提供之前的任何异常Java 使用非常规方案获取重定向请求的最终URL,java,http,apache-commons-httpclient,Java,Http,Apache Commons Httpclient,我的代码(如下)尝试从执行了一点重定向的服务器返回最终URL。只要URL具有http方案,它就可以正常工作。当我想用不同的方案返回URL时,问题就出现了。最终,在某些情况下,我希望返回一个market://url或其他应用程序发布方案,因为这是针对Android的,我想用它们开始尝试 因此,这让我能够检索最终的http url,但是当最终url为market://时,它抛出所看到的异常(java.lang.IllegalStateException:Scheme'market'not regis
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 在工作中使用
HttpURLConnection
对我来说很有效。当目标资源不是HTTP资源时,以下重定向将毫无例外地停止
HttpURLConnection connection = (HttpURLConnection) new URL(mInitialUrl).openConnection();
connection.setInstanceFollowRedirects(true);
String location = connection.getHeaderField("location");
使用
URLConnection
进行快速测试对我很有用。你愿意改用它吗?哦,是的。我来试试,好的。我发布了一个答案。connection.getHeaderField(“位置”)对我来说总是空的。我尝试插入连接。connect(),但没有成功。有趣的是。。。如果我将setInstanceFlowRedirects更改为false,那么它将为“location”提供重定向值。显然,该位置是重定向头的一部分,如果它自动遵循重定向,它将无法获得该位置?(我的线索在这里:)存在多个重定向的问题。我可以得到第一个重定向,但由于它没有跟随它到底,所以我无法得到最后一个重定向。这正是setInstanceFlowRedirects()
被设置为true
的原因。至于最后为什么会出现null
,很抱歉,我无法在Oracle Java 1.7.0_10中重现它。您最好的选择是禁用以下重定向并在循环中连接,只要您找到指向HTTP(S)资源的Location
头。因此根据该建议,我发现其中一个重定向未能设置有效的位置头字段(url未正确编码)。问题解决了!谢谢你的帮助。