防止java.net.URL剥离“文件”&引用;如果没有查询参数
我试图使用防止java.net.URL剥离“文件”&引用;如果没有查询参数,java,android,http,url,uri,Java,Android,Http,Url,Uri,我试图使用java.net.HttpURLConnection对URL发出如下请求: https://example.com/app/?#/something=else&someting2=else2 为此,我需要构造一个java.net.url,但构造函数去掉了问号“?”: 当我用url.openConnection()创建连接时,我只得到一个404 我明白它为什么会这样。它严格地将散列之后的所有内容(包括散列)识别为url片段,这意味着实际url变成https://example.
java.net.HttpURLConnection
对URL发出如下请求:
https://example.com/app/?#/something=else&someting2=else2
为此,我需要构造一个java.net.url,但构造函数去掉了问号“?”:
当我用url.openConnection()
创建连接时,我只得到一个404
我明白它为什么会这样。它严格地将散列之后的所有内容(包括散列)识别为url片段,这意味着实际url变成https://example.com/app/?
。然后,它只是去掉后面的问号。但是我需要URL按原样呈现。
这是一款Android应用程序
如何强制HTTPUrlConnection在URL中发出带有问号的GET请求?在URL中,
?
之后的部分是一个查询字符串,
之后的部分是一个片段标识符,正如您已经注意到的
当查询字符串被发送到服务器时,片段标识符是无效的,因此尝试发送一个是没有意义的
2种可能性:
- 如果它是一个片段标识符,您不需要发送它,Android的行为(规范化URL)是正确的。剥离尾部的
(空查询字符串)不应该是问题,因为单独剥离(对于服务器和客户端)没有意义。如果您想在客户端代码中保留片段,您需要的是创建一个?
,使用该URI在任何地方显示,然后在需要与服务器对话时使用URI
转换为toURL()
URL
- 如果它实际上不是一个片段标识符,那么它应该是查询字符串的一部分,因此您需要发送一个哈希符号作为URL的一部分:在这种情况下,您需要将其URL编码到
,%23
后面的部分不会被剥离,服务器将知道如何处理编码的?
%23
?
后面的部分是一个查询字符串,#
后面的部分是一个片段标识符,正如您已经注意到的
当查询字符串被发送到服务器时,片段标识符是无效的,因此尝试发送一个是没有意义的
2种可能性:
- 如果它是一个片段标识符,您不需要发送它,Android的行为(规范化URL)是正确的。剥离尾部的
(空查询字符串)不应该是问题,因为单独剥离(对于服务器和客户端)没有意义。如果您想在客户端代码中保留片段,您需要的是创建一个?
,使用该URI在任何地方显示,然后在需要与服务器对话时使用URI
转换为toURL()
URL
- 如果它实际上不是一个片段标识符,那么它应该是查询字符串的一部分,因此您需要发送一个哈希符号作为URL的一部分:在这种情况下,您需要将其URL编码到
,%23
后面的部分不会被剥离,服务器将知道如何处理编码的?
%23
%3F
而不是问号?或者更确切地说是%23
而不是
?@HuguesM。但是当我对url进行url编码时,我不会对#进行编码,不是吗?服务器如何知道必须将%23解码为#,然后将其视为片段标记?既然它是经过编码的,那么它是否会向服务器发出不应将其视为片段标记的信号?片段标识符是,因此尝试发送一个是没有意义的。因此,我假设它不是一个真正的片段标记,您希望将一个实际的哈希符号作为URL的一部分发送到服务器,在这种情况下,您需要将其编码为%23
啊,可能就是这样<代码>%3F而不是问号?或者更确切地说是%23
而不是
?@HuguesM。但是当我对url进行url编码时,我不会对#进行编码,不是吗?服务器如何知道必须将%23解码为#,然后将其视为片段标记?既然它是经过编码的,那么它是否会向服务器发出不应将其视为片段标记的信号?片段标识符是,因此尝试发送一个是没有意义的。因此,我假设它不是一个真正的片段标记,您希望将一个实际的哈希符号作为URL的一部分发送到服务器,在这种情况下,您需要将其编码为%23
啊,可能就是这样!
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