防止java.net.URL剥离"?"如果没有查询参数

时间:2017-08-08 21:20:14

标签: java android http url uri

我正在尝试使用java.net.HttpURLConnection来向这样的网址发出请求:

https://example.com/app/?#/something=else&someting2=else2

为了做到这一点,我需要构建一个java.net.url,但构造函数会删除问号"?":

java.net.URL url = new URL("https://example.com/app/?#/something=else&someting2=else2");
String string = url.toString(); 
// String is https://example.com/app/#/something=else&someting2=else2

当我与url.openConnection()创建连接时,我只得到404。

我明白为什么会这样做。它很好地识别了包含散列#作为url片段之后的所有内容,这意味着实际的url变为https://example.com/app/?。然后,它只是删除尾随的问号。但我需要按原样呈现URL。 这适用于Android应用。

如何强制HTTPUrlConnection通过URL中的问号发出GET请求?

1 个答案:

答案 0 :(得分:2)

在网址中,?之后的部分是查询字符串,而#之后的部分是片段标识符,就像您一样已经注意到了。

当查询字符串被发送到服务器时,片段标识符is not,所以尝试发送一个没有意义。

2种可能性:

  • 如果片段标识符,则无需发送它,Android的行为(规范化URL)是正确的。剥离尾随?(空查询字符串)应该不是问题,因为它没有任何意义(对于服务器和客户端)。如果您想在客户端代码中保留片段,您想要的是创建URI,使用它来显示您想要的位置,然后在需要时使用URL转换为toURL()跟服务器说话。

  • 如果它实际上是一个片段标识符,它应该是查询字符串的一部分,所以你需要发送一个哈希符号作为URL的一部分:在这种情况下,您需要将其网址编码为%23?之后的部分不会被剥离,服务器将知道如何处理编码的%23

相关问题