缺少请求正文的 Spring Boot POST 请求?

Posted

技术标签:

【中文标题】缺少请求正文的 Spring Boot POST 请求?【英文标题】:Spring Boot POST request with missing request body? 【发布时间】:2018-07-18 18:01:31 【问题描述】:

我有一个非常简单的 html 表单页面(它是 src/main/resources/public/web.html 中 Spring Boot Web 应用程序的一部分),用于将字符串从 textarea 发布到 Spring Boot Web 应用程序 1.5 版。 2.

<form action="" method="post">
<textarea cols="128" rows="40" name="query"></textarea>
<input value="Send" type="submit">
</form>

以及处理 POST 请求的 SpringBoot 类:

@RestController
public class QueryController 
    @RequestMapping(value = "/handle", method = RequestMethod.POST)
    protected void handlePost(@RequestBody String postBody) throws Exception 
       // Get query from postBody here
    

它适用于客户端文本区域中的小字符串。但是,当字符串很大时(例如:带有 HTTP 请求标头:Content-Length:3789333 (3 MB))。 Spring Boot 会抛出这样的异常:

org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: protected void QueryController.handlePost(java.lang.String) throws java.lang.Exception
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:154)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:128)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)

我不确定是什么导致了这个问题,我正在使用 Spring Boot 中的嵌入式 Tomcat 运行 Web 应用程序。

【问题讨论】:

【参考方案1】:

我不确定,但这可能是由于缺少内容的编码造成的吗?

【讨论】:

【参考方案2】:

问题是@RequestBody 无法为大查询获取值。但是,从 HttpServletRequest 获取请求体可以获取值

 protected void handlePost(HttpServletRequest httpServletRequest) throws Exception 
    String postBody = this.getPOSTRequestBody(httpServletRequest); 

 

【讨论】:

【参考方案3】:

将您的控制器更新为以下内容:

@RestController
public class QueryController 
    @RequestMapping(value = "/handle", method = RequestMethod.POST)
    protected void handlePost(@RequestParam(value="query",required=false) String query) throws Exception 
       // Your code goes here
    

如果你没有通过参数你会得到org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'query' is not present。如果不需要参数,您可以将required=false 添加到RequestParam。 RequestParam 默认required=true

这取决于您的服务器。我希望你使用Tomcat。默认情况下,服务器有maxPostSize。以下是针对 Tomcat

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               maxPostSize="6291456" />

maxPostSize 在我之前的代码中是 6MB。

【讨论】:

只有当 POST 很大时才会出现另一个错误] ExceptionHandlerExceptionResolver@189:已解决由处理程序执行引起的异常:java.lang.NullPointerException 错误 [09:39:24] ExceptionAdvice@57:捕获异常:org. springframework.web.bind.MissingServletRequestParameterException:必需的字符串参数“查询”不存在 大查询,查询值为null,没用。 它也不行,谢谢你的尝试,我没有上传文件。 maxPostSize 没有帮助?

以上是关于缺少请求正文的 Spring Boot POST 请求?的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot 的 Postman Post 请求保存了整个 JSON 正文,而不仅仅是字段值。我该如何解决?

错误:缺少所需的请求正文

向服务器发送 POST 请求,服务器的响应为空,Angular - Spring-boot

POST 使用 RestTemplate、查询参数和请求正文

Alamofire POST 请求,正文中有一个简单的字符串作为参数,标头仍然显示缺少的参数值

没有请求正文的对象的 Spring Boot RestClient 发布导致错误请求