Servlet中PUT请求调用request.getParameter返回null但POST正常怎么处理
Postman请求示例截图:
1. 为什么request.getParameter()在PUT请求中无法正常工作?
- Servlet规范默认仅对POST请求下
Content-Type为application/x-www-form-urlencoded的请求体做自动参数解析,会把请求体中的键值对填充到参数Map中,因此相同逻辑在doPost方法中可以正常运行。 - PUT请求在早期HTTP设计中的定位是上传完整资源实体的方法,不属于表单提交的标准场景,因此Servlet容器默认不会解析PUT请求的表单编码请求体,哪怕请求头
Content-Type符合要求,调用getParameter()也只会返回null。
2. 如何在doPut()中获取参数值?
有两种通用的解决方案:
方案1:手动解析请求体(无额外依赖,适配所有场景)
直接读取PUT请求的输入流,按照表单编码规则拆分解码键值对即可,参考代码如下:
@Override protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 读取请求体完整内容 BufferedReader reader = req.getReader(); StringBuilder requestBodyBuilder = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { requestBodyBuilder.append(line); } String requestBody = requestBodyBuilder.toString(); // 拆分解析表单键值对 Map<String, String> paramMap = new HashMap<>(); String[] keyValuePairs = requestBody.split("&"); for (String pair : keyValuePairs) { String[] keyValue = pair.split("="); String key = URLDecoder.decode(keyValue[0], StandardCharsets.UTF_8.name()); String value = keyValue.length > 1 ? URLDecoder.decode(keyValue[1], StandardCharsets.UTF_8.name()) : ""; paramMap.put(key, value); } // 业务逻辑取值 System.out.println("NAME: " + paramMap.get("name")); System.out.println("PHONE: " + paramMap.get("phone")); System.out.println("CT: " + req.getContentType()); }
方案2:过滤器统一解析(适合项目全局需要支持PUT表单参数的场景)
如果使用Spring框架,可直接配置内置的HttpPutFormContentFilter,该过滤器会自动识别PUT请求的application/x-www-form-urlencoded类型请求体,提前解析成参数填充到request对象中,后续doPut方法可直接调用getParameter()取值,无需重复手动解析。
如果是原生Servlet项目,也可以自定义过滤器,参考上述手动解析逻辑,在过滤器中提前解析PUT请求参数,封装为自定义的HttpServletRequestWrapper传递给后续业务逻辑即可。
内容的提问来源于stack exchange,提问作者Roshana Pitigala
相关产品推荐
相关产品推荐

