如果查询参数值的特殊字符 (&) 部分,如何读取查询参数值

How to read query param value if special character (&) part of query param value

Url: 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.

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

如果我们传递任何类型的特殊字符,我们必须对这些值进行编码。 Java 提供了 URLEncoder class 用于将任何查询字符串或表单参数编码为 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