用Java解码URI查询字符串

Jas*_*n S 26 java decoding query-string

我需要解码包含查询字符串的URI; 预期的输入/输出行为类似于以下内容:

abstract class URIParser
{       
    /** example input: 
      * something?alias=pos&FirstName=Foo+A%26B%3DC&LastName=Bar */
    URIParser(String input) { ... }
    /** should return "something" for the example input */
    public String getPath(); 
    /** should return a map 
      * {alias: "pos", FirstName: "Foo+A&B=C", LastName: "Bar"} */
    public Map<String,String> getQuery();
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过使用java.net.URI,但它似乎解码了查询字符串所以在上面的例子中我留下了"alias = pos&FirstName = Foo + A&B = C&LastName = Bar"所以有一个歧义"是& "是查询分隔符,或者是查询组件中的字符.

编辑:我刚刚尝试了URI.getRawQuery()并且它没有进行编码,所以我可以用a分割查询字符串&,但是我该怎么办?Javascript有decodeURIComponent,我似乎无法在Java中找到相应的方法.

有什么建议?我宁愿不使用任何新库.

jan*_*anb 62

使用

URLDecoder.decode(proxyRequestParam.replace("+", "%2B"), "UTF-8")
          .replace("%2B", "+")
Run Code Online (Sandbox Code Playgroud)

模拟decodeURIComponent.Java URLDecoder将加号解码为空格,这不是您想要的,因此您需要替换语句.

警告:.replace("%2B", "+")在年底破坏你的数据,如果原来的(预X WWW的形式,进行了urlencoded)含有该字符串,如@xehpuk指出.

  • @StevePowell第二个替换不仅是不必要的,这是错误的. (6认同)
  • @janb - 我认为第二个替换是不必要的,因为`decode`方法已经将它找到的任何`%2B`转换为`+`.第一次替换是必要的,以阻止它将"+"转换为空格. (4认同)
  • 这应该是公认的答案.URI按原样处理+符号,而空格则编码为%20.URLDecoder与URI编码的字符串不兼容,因为它会将+和%20解码为空格. (3认同)
  • 第二次取代有什么意义?在解码之后,字符串中将不再存在"%2B"的任何实例,因为它们将全部替换为"+",因此替换匹配将没有任何内容. (3认同)
  • 关键是你不希望在解码的字符串中编码字符.由于Java不像JavaScript一样解码+ -sign,我首先对+ -sign进行编码,以便Java不会触及它,然后将%2B解码为+ -sign.简而言之:如果我不这样做,解码后的URL将不包含原始的+ -signs(因为Java会在解码阶段丢失它们). (2认同)

Mau*_*rry 17

请参阅类URLDecoder

  • 应该注意的是,您应该在使用之前识别查询部分并将参数拆分为键/值对,但它会根据HTML应用程序将百分比编码的值解码为给定的编码(请参阅UTF-8)/x-www-form-urlencoded`规范. (5认同)
  • 始终将答案放在您的答案中。链接出去会产生额外的工作,并且不能保证链接始终有效。 (4认同)

Bha*_*ani 6

var reqParam =  URLDecoder.decode(reqParam, "UTF-8")
Run Code Online (Sandbox Code Playgroud)