【问题标题】:How to read query param value if special character (&) part of query param value如果查询参数值中有特殊字符 (&) 部分,如何读取查询参数值
【发布时间】:2022-01-20 06:15:02
【问题描述】:

网址:https://myproject.dev.com/methodology/Culture?contentName=abc & def&path=Test&type=folder

只需要从上面的 URL 中获取查询参数,但问题是 contentName=abc & def 中的“&”,所以在获取 contentName 时,会在 abc、def 等两部分中获取值。

请建议获取 contentName 的方法是 abc & def 而不是 abc,def。

【问题讨论】:

    标签: java rest https urlencode


    【解决方案1】:

    如果 & 字符是查询字符串中名称或值的一部分,则它必须进行百分比编码。在给定的示例中:contentName=abc%26def&path=Test&type=folder

    【讨论】:

    • 感谢您的回答。如果 contentName=abc & def(包含空格)则编码 abc%20%26%20def 所以这种情况下它不能正常工作
    • 根据规范,空格应该被编码为“+”。正如@Trisav 指出的那样,您可以使用URLEncoder (wrongly named :-)) 类。
    【解决方案2】:

    如果我们传递任何类型的特殊字符,我们必须对这些值进行编码。 Java 提供了一个URLEncoder 类,用于将任何查询字符串或表单参数编码为 URL 编码格式。在对 URI 进行编码时,常见的缺陷之一是对完整的 URI 进行编码。通常,我们只需要对 URI 的查询部分进行编码。

    public static void main(String[] args) {
        Map<String, String> requestParameters = new LinkedHashMap<>();
        requestParameters.put("contentName", "abc & def");
        requestParameters.put("path", "Test");
        requestParameters.put("type", "folder");
    
        String encodedURL = requestParameters.keySet().stream()
                .map(key -> key + "=" + encodeValue(requestParameters.get(key)))
                .collect(Collectors.joining("&", "https://myproject.dev.com/methodology/Culture?", ""));
        System.out.println(encodedURL);
    }
    
    private static String encodeValue(String value) {
        String url = "";
        try {
            url = URLEncoder.encode(value, StandardCharsets.UTF_8.toString());
        } catch (Exception ex) {
            System.out.println(ex);
        }
        return url;
    }
    

    输出:

    https://myproject.dev.com/methodology/Culture?contentName=abc+%26+def&path=Test&type=folder
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      • 2019-03-06
      • 2013-06-06
      • 2020-04-05
      • 1970-01-01
      相关资源
      最近更新 更多