Spring Boot POST端点添加多参数报400错误,如何正确实现?
问题原因
HTTP POST请求仅允许存在一个请求体,Spring Boot的@RequestBody注解是用来绑定整个请求体内容的。你添加两个@RequestBody参数后,Spring无法将单个请求体拆分分配给两个参数,因此返回400 Bad Request。Swagger UI显示两个输入框是因为它仅根据注解生成界面,未严格校验HTTP规范,实际请求时只能发送一个请求体,导致后端解析失败。
解决方案
根据业务场景选择以下任意一种方案:
方案1:使用请求参数(Query Parameter)
将第二个参数改为URL查询参数,通过@RequestParam接收:
@ApiOperation(value = "...", consumes = MediaType.TEXT_PLAIN_VALUE) @PostMapping(value = "handleRequest", consumes = MediaType.TEXT_PLAIN_VALUE) @ResponseStatus(HttpStatus.OK) public String handleRequest( @Parameter(name = "Request", description = "The body of a request", example = "...") @RequestBody String body, @Parameter(name = "Request2", description = "The body of a second request", example = "...") @RequestParam String body2) { // 业务逻辑 }
Swagger会自动显示URL参数输入框,请求时参数将拼在URL后,后端可正常接收。
方案2:使用请求头(Request Header)
如果第二个参数内容较短,可放在请求头中,通过@RequestHeader接收:
@ApiOperation(value = "...", consumes = MediaType.TEXT_PLAIN_VALUE) @PostMapping(value = "handleRequest", consumes = MediaType.TEXT_PLAIN_VALUE) @ResponseStatus(HttpStatus.OK) public String handleRequest( @Parameter(name = "Request", description = "The body of a request", example = "...") @RequestBody String body, @Parameter(name = "Request2", description = "The body of a second request", example = "...") @RequestHeader("Request2") String body2) { // 业务逻辑 }
Swagger会显示请求头输入框,提交时参数将携带在请求头中。
方案3:封装为DTO(推荐)
将两个文本参数封装成JSON对象,符合REST接口规范,同时保持Swagger的友好输入体验:
- 定义DTO类:
@Data public class RequestDTO { @ApiModelProperty(value = "The body of a request", example = "...") private String body; @ApiModelProperty(value = "The body of a second request", example = "...") private String body2; }
- 修改接口:
@ApiOperation(value = "...", consumes = MediaType.APPLICATION_JSON_VALUE) @PostMapping(value = "handleRequest", consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(HttpStatus.OK) public String handleRequest(@RequestBody RequestDTO requestDTO) { String body = requestDTO.getBody(); String body2 = requestDTO.getBody2(); // 业务逻辑 }
注意需将consumes改为APPLICATION_JSON_VALUE,Swagger会显示JSON格式的输入框,用户可输入包含两个字段的JSON内容。
方案4:使用表单提交
如果需要保持多输入框的直观体验,可改为表单提交方式:
@ApiOperation(value = "...", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) @PostMapping(value = "handleRequest", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) @ResponseStatus(HttpStatus.OK) public String handleRequest( @Parameter(name = "Request", description = "The body of a request", example = "...") @RequestParam String body, @Parameter(name = "Request2", description = "The body of a second request", example = "...") @RequestParam String body2) { // 业务逻辑 }
Swagger会显示两个表单输入框,提交时Spring可正确解析表单数据。
内容的提问来源于stack exchange,提问作者user3573403
相关产品推荐
相关产品推荐

