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

Spring Boot中@RequestBody无法接收HTML POST请求体问题

问题分析与解决方案

核心问题

  1. 注解框架混用:后端代码同时使用了JAX-RS(@POST/@Path/@Consumes)和Spring MVC(@RequestBody)的注解,两者参数绑定机制不兼容,导致请求体无法正确接收。
  2. Content-Type不匹配:HTML表单默认以application/x-www-form-urlencoded格式提交键值对,而@RequestBody(Spring)用于接收application/json格式的原始请求体,直接使用会导致参数为空。

解决方案

方案1:保持表单提交(application/x-www-form-urlencoded)

根据你使用的Web框架选择对应代码:

若使用Spring MVC(Spring Boot默认)

替换后端注解为Spring MVC标准注解,用@RequestParam接收表单参数:

@PostMapping("/pruebaRequest")
public ResponseEntity<String> pruebaRequest(@RequestParam("param1") String param1, @RequestParam("requestBody") String requestBody) throws Exception {
    System.out.println("Param 1: " + param1);
    System.out.println("Request Body: " + requestBody);
    // 可在此解析requestBody中的JSON字符串
    return ResponseEntity.ok("处理完成");
}

若使用JAX-RS(如Jersey)

使用JAX-RS的@FormParam接收表单字段:

import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@POST
@Path("/pruebaRequest")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response pruebaRequest(@QueryParam("param1") String param1, @FormParam("requestBody") String requestBody) throws Exception {
    System.out.println("Param 1: " + param1);
    System.out.println("Request Body: " + requestBody);
    return Response.ok("处理完成").build();
}

方案2:改为JSON格式提交(推荐,若需传递复杂JSON)

修改前端用JavaScript发送JSON请求,后端用@RequestBody接收:

前端代码

替换原表单为手动发送JSON的逻辑:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input type="text" id="requestBody" placeholder='输入JSON,例如{"codigo": "10", "mensaje": "Error en el api"}'>
    <button onclick="sendJsonRequest()">enviar</button>

    <script>
        function sendJsonRequest() {
            const jsonContent = document.getElementById('requestBody').value;
            fetch('http://devlocal1.mx.att.com:7003/pruebaRequest?param1=123', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                },
                body: jsonContent,
            })
            .then(res => res.text())
            .then(data => console.log(data))
            .catch(err => console.error('请求失败:', err));
        }
    </script>
</body>
</html>

后端代码(Spring MVC)

@PostMapping("/pruebaRequest")
public ResponseEntity<String> pruebaRequest(@RequestParam("param1") String param1, @RequestBody String requestBody) throws Exception {
    System.out.println("Param 1: " + param1);
    System.out.println("Request Body: " + requestBody);
    // 若需转为实体类,可使用Jackson解析:
    // YourEntity entity = new ObjectMapper().readValue(requestBody, YourEntity.class);
    return ResponseEntity.ok("处理完成");
}

后端代码(JAX-RS)

import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@POST
@Path("/pruebaRequest")
@Consumes(MediaType.APPLICATION_JSON)
public Response pruebaRequest(@QueryParam("param1") String param1, String requestBody) throws Exception {
    System.out.println("Param 1: " + param1);
    System.out.println("Request Body: " + requestBody);
    return Response.ok("处理完成").build();
}

内容的提问来源于stack exchange,提问作者Jeshua Flako

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:34:59