Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.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.net.URL剥离“文件”&引用;如果没有查询参数_Java_Android_Http_Url_Uri - Fatal编程技术网

防止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


在URL中,
后面的部分是一个查询字符串,
#
后面的部分是一个片段标识符,正如您已经注意到的

当查询字符串被发送到服务器时,片段标识符是无效的,因此尝试发送一个是没有意义的

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