You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的友好输入体验:

  1. 定义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;
}
  1. 修改接口:
@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:52:22