在 Java 中解码 URI 查询字符串

2022-09-01 09:14:04

我需要解码包含查询字符串的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();
}

我尝试过使用java.net.URI,但它似乎解码了查询字符串,因此在上面的示例中,我留下了“alias=pos&FirstName=Foo+A&B=C&LastName=Bar”,因此“&”是查询分隔符还是查询组件中的字符存在歧义。

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

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


答案 1

URLDecoder.decode(proxyRequestParam.replace("+", "%2B"), "UTF-8")
          .replace("%2B", "+")

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

警告:正如@xehpuk指出的那样,如果原始(pre-x-www-form-urlencoded)包含该字符串,则最后损坏您的数据。.replace("%2B", "+")


答案 2

请参阅类 URLDecoder