@RequestBody的使用
注解@RequestBody用於接收前端傳遞給后端的、JSON對象的字符串,這些數據位於請求體中,適合處理的數據為非Content-Type: application/x-www-form-urlencoded編碼格式的數據,比如:application/json、application/xml等類型的數據。就application/json類型的數據而言,使用注解@RequestBody可以將body里面所有的JSON字符串綁定到后端相應的Java Bean上,后端再進行數據解析和業務操作。需要格外注意的是,JSON字符串中的key必須對應Java Bean中的屬性名;否則,無法接收到相關key的值。GET請求中,因為沒有請求體,所以@RequestBody並不適用。POST請求中,必須要在請求頭中聲明數據的類型Content-Type。Spring MVC通過使用系統默認配置的HttpMessageConverters解析請求體中的數據,然后把數據綁定到相應的Java Bean上。
溫馨提示:一個請求,只可以使用一個@RequestBody注解,卻可以使用多個@RequestParam注解。
@RestController
@RequestMapping("/user")
public class UserController {
@PostMapping("/testRequestBody")
public User testRequestBody(@RequestBody User user){
return user;
}
/**
* 同時使用 @RequestBody 與 @RequestParam()
* http://localhost:8087/wiener/user/testRequestBody?token=IamToken
* @param user
* @param token
* @return
* @throws Exception
*/
@PostMapping("/testRequestBodyAndParam")
public User testRequestBodyAndParam(@RequestBody User user, @RequestParam("token") String token) throws Exception {
user.setRemark(token);
return user;
}
}
其中,Java Bean User定義如下:
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.stereotype.Component;
import java.io.Serializable;
/**
* @author Wiener
*/
@Setter
@Getter
@ToString
@Component
public class User implements Serializable {
private static final long serialVersionUID = 4268287310462519889L;
private Long id;
private int age;
private String name;
private String remark;
public User() {
}
public User(Long id, int age, String name) {
super();
this.id = id;
this.age = age;
this.name = name;
}
}
啟動項目,使用Postman模擬前端HTTP請求,測試結果如下,說明兩個注解可以同時使用。
Spring 注解之@PostMapping
@PostMapping是一個組合注解,在Spring framework 4.3作為@RequestMapping(method = RequestMethod.POST)的變體引入,它將HTTP Post請求映射到特定的處理方法上。例如,使用@PosttMapping("/testRequestBody")就等價於@RequestMapping(value ="/testRequestBody",method = RequestMethod.POST),顯然,這可以精簡我們的代碼。
小結
在GET請求中,不能使用@RequestBody。在POST請求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,對於參數轉化的約定,前后端必須統一。