HttpServletRequest - 获取查询字符串参数,无表单数据

Jas*_*ltz 68 java servlets query-string

HttpServletRequest中,getParameterMap返回所有查询字符串参数的Map和发布数据参数.

有没有办法获得一个只有查询字符串参数的Map?我试图避免使用getQueryString并解析出值.

coa*_*ine 75

你可以使用request.getQueryString(),如果查询字符串是这样的

username=james&password=pwd
Run Code Online (Sandbox Code Playgroud)

要获得名称,您可以这样做

request.getParameter("username"); 
Run Code Online (Sandbox Code Playgroud)

  • 第二个会破坏请求流,我假设问题是如何获取用户名并保留输入流以供以后处理 (2认同)

Dou*_*alt 20

与cularis所说的相反,参数图中可以存在两者.

我看到的最好的方法是代理参数Map,并为每个参数检索检查queryString是否包含"&?<parameterName> =".

请注意,在进行此检查之前,parameterName需要进行URL编码,正如Qerub所指出的那样.

这可以节省您的解析,但仍然只提供URL参数.

  • 查询字符串永远不会包含`?`.这是URI和查询字符串之间的分隔符. (11认同)
  • 请注意,在进行此检查之前,`parameterName`需要进行URL编码. (2认同)

小智 19

servlet API缺少此功能,因为它是在许多人认为查询字符串和消息体只是发送参数的两种不同方式的时间创建的,而没有意识到参数的用途根本不同.

查询字符串参数?foo = bar是URL的一部分,因为它们涉及识别资源(可能是许多资源的集合),例如"所有42岁的人":

GET /人?年龄= 42岁

POST或PUT中的消息体参数用于表示对目标资源的修改.Fx将值设置为属性"hair":

PUT /人?年龄= 42岁

头发=灰色

因此,同时使用查询参数和主体参数绝对是RESTful,分开以便您可以将它们用于不同的目的.Java servlet API中肯定缺少该功能.


Bre*_*ren 11

正如其他答案所述,使用servlet api无法获取查询字符串参数.

所以,我认为获取查询参数的最佳方法是自己解析查询字符串.(迭代参数并检查查询字符串是否包含参数更复杂)

我写下面的代码来获取查询字符串参数.使用apache StringUtils和ArrayUtils.

public static Map<String, String[]> getQueryParameters(HttpServletRequest request) {
    Map<String, String[]> queryParameters = new HashMap<>();
    String queryString = request.getQueryString();

    if (StringUtils.isEmpty(queryString)) {
        return queryParameters;
    }

    String[] parameters = queryString.split("&");

    for (String parameter : parameters) {
        String[] keyValuePair = parameter.split("=");
        String[] values = queryParameters.get(keyValuePair[0]);
        values = ArrayUtils.add(values, keyValuePair.length == 1 ? "" : keyValuePair[1]); //length is one if no value is available.
        queryParameters.put(keyValuePair[0], values);
    }
    return queryParameters;
}
Run Code Online (Sandbox Code Playgroud)


小智 8

爪哇8

return Collections.list(httpServletRequest.getParameterNames())
                  .stream()
                  .collect(Collectors.toMap(parameterName -> parameterName, httpServletRequest::getParameterValues));
Run Code Online (Sandbox Code Playgroud)