AJAX传递JSON调用SpringBoot Controller及响应处理问题
解决AJAX传JSON到Spring Boot Controller的问题
首先咱们先理清核心问题:GET请求不适合传输JSON请求体,这是你当前代码的主要问题之一,然后再一步步调整前端和后端代码。
一、请求方法选择:用POST而非GET
GET请求的设计目的是获取资源,它会把data里的内容转换成URL查询参数,完全忽略你设置的content-type: application/json。而POST请求才是用来提交数据的,支持在请求体中传输JSON,这才符合你的需求。
二、修正前端AJAX代码
先把前端的语法错误和请求方式改过来:
<script> database.on('child_added', function (snapshot) { var data = {}; data["FirstName"] = snapshot.val().FirstName; data["LastName"] = snapshot.val().LastName; data["Number"] = snapshot.val().Number; $.ajax({ type: "POST", // 改成POST请求 contentType: "application/json", url: "/application/print", // 如果是跨域要写全路径,比如http://localhost:8080/application/print data: JSON.stringify(data), dataType: 'json', cache: false, success: function(response){ console.log("Successfully sent payload", response); // 可以打印后端返回的响应内容 }, error: function(e){ console.log("Error", e); // 修正原来的语法错误 } }); }); </script>
三、后端Controller的修改
要接收JSON并返回响应,咱们需要做这几步:
1. 创建对应JSON结构的实体类(可选但推荐)
创建一个类来映射前端传过来的字段,这样类型更安全,也方便后续处理:
public class UserData { // 字段名和前端JSON的key保持一致,或者用@JsonProperty指定映射关系 private String FirstName; private String LastName; private String Number; // 如果是数字类型可以用Integer/Long,根据你的数据来 // 必须要有无参构造函数,Jackson需要它来实例化对象 public UserData() {} // Getter和Setter方法(可以用Lombok的@Data注解一键生成) public String getFirstName() { return FirstName; } public void setFirstName(String firstName) { FirstName = firstName; } public String getLastName() { return LastName; } public void setLastName(String lastName) { LastName = lastName; } public String getNumber() { return Number; } public void setNumber(String number) { Number = number; } }
2. 修改Controller方法
用@PostMapping接收POST请求,@RequestBody自动解析请求体的JSON到实体类,最后返回JSON响应:
import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; @RestController @RequestMapping("/application") public class AppController { @PostMapping("/print") // @RequestBody注解让Spring自动把JSON转成UserData对象 public ResponseEntity<Map<String, Object>> handleUserData(@RequestBody UserData userData) { // 这里写你的业务逻辑,比如打印数据 System.out.println("收到用户数据:"); System.out.println("FirstName: " + userData.getFirstName()); System.out.println("LastName: " + userData.getLastName()); System.out.println("Number: " + userData.getNumber()); // 准备返回给前端的响应内容 Map<String, Object> response = new HashMap<>(); response.put("status", "success"); response.put("message", "数据接收并处理完成"); response.put("receivedData", userData); // 可以把收到的数据回传给前端 // 返回HTTP 200状态码+JSON响应 return ResponseEntity.ok(response); } }
3. 简化方案(不用实体类)
如果你不想创建实体类,也可以直接用Map<String, Object>接收JSON:
@PostMapping("/print") public ResponseEntity<Map<String, Object>> handleUserData(@RequestBody Map<String, Object> userData) { System.out.println("FirstName: " + userData.get("FirstName")); // 其他处理逻辑... Map<String, Object> response = new HashMap<>(); response.put("status", "success"); return ResponseEntity.ok(response); }
关键知识点说明
@RequestBody:必须加这个注解,Spring才会把请求体里的JSON绑定到方法参数上,Spring Boot Web Starter默认已经包含Jackson来处理JSON解析。ResponseEntity:用来灵活控制HTTP状态码和响应体,比直接返回对象更灵活,比如可以返回400(参数错误)、500(服务器错误)等状态码。- 跨域问题:如果前端和后端不在同一域名/端口,需要在Controller上加
@CrossOrigin注解解决跨域。
内容的提问来源于stack exchange,提问作者Vai
相关产品推荐
相关产品推荐

