Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用非常规方案获取重定向请求的最终URL_Java_Http_Apache Commons Httpclient - Fatal编程技术网

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

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

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

因此,这让我能够检索最终的http url,但是当最终url为market://时,它抛出所看到的异常(java.lang.IllegalStateException:Scheme'market'not registered),然后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

在工作中使用
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未正确编码)。问题解决了!谢谢你的帮助。