Spring Boot中@RequestBody无法接收HTML POST请求体问题
问题分析与解决方案
核心问题
- 注解框架混用:后端代码同时使用了JAX-RS(
@POST/@Path/@Consumes)和Spring MVC(@RequestBody)的注解,两者参数绑定机制不兼容,导致请求体无法正确接收。 - 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
相关产品推荐
相关产品推荐

