首页 > 解决方案 > Spring Boot POST 参数大小限制

问题描述

我似乎在某个地方与限制器相撞。我的一个 Spring-Boot REST 端点 (POST) 参数 ( surveyResults) 正在寻找一串 JSON:


    private static final String SURVEY_RESULTS_ENDPOINT = "/survey/results";

    @PostMapping(
        value = SURVEY_RESULTS_ENDPOINT, 
        produces = { "application/hal+json", "application/json" }
    )   
    @ApiOperation(value = "Save one survey results")
    public Resource<SurveyResult> createSurveyResults(

            @ApiParam(value = "who/what process created this record", required = true) @Valid 
                @RequestParam(value = "recordCreatedBy", required = true) String createdBy,

            @ApiParam(value = "was an issue identified", required = true) 
                @RequestParam(value = "hadFailure", required = true) Boolean hadFailure,

            @ApiParam(value = "JSON representation of the results", required = true) 
                @RequestParam(value = "surveyResults", required = true) String surveyResult

    ) ...

如果我用大约 1500 个字符发布到这里,它就可以工作。就在某个地方,它会因 HTTP400错误bad request而失败。加上其他参数,整个payload小于2K。

我刚从 Wildfly 搬到新的服务器设置。我的公司正在对云服务器进行持续部署,因此我对这个新的负载平衡服务器没有太多控制或可见性。服务器是"server": "openresty/1.13.6.2"- 知道我遇到了什么限制吗?

标签: javajsonspring-bootopenresty

解决方案


请使用@RequestBody而不是@RequestParam.

@RequestBody注释将 HTTP 请求的主体映射到一个对象。@RequestParam映射请求中的请求参数,该参数在 URL 中而不是在正文中。

大多数浏览器对请求参数中支持的字符数都有限制,而您只需达到该限制即可。

我的建议是创建一个看起来像这样的 POJO

public class Body {
   private String createdBy; 
   private Boolean hadFailure;  
   private String surveyResult;

// getters and setters
}

现在你的控制器会更简单

@PostMapping(
        value = SURVEY_RESULTS_ENDPOINT, 
        produces = { "application/hal+json", "application/json" }
    )   
public Resource<SurveyResult> createSurveyResults(@RequestBody Body body) {

}

无论您在哪里发布,您现在都必须发布一个Content-Type = application/json如下所示的 JSON ( )

{ "createdBy" : "foo", "hadFailure" : false, "surveyResult" : "the foo bar"}

推荐阅读