【springboot】@RequestBody和@ResponseBody以及@PathVariable的使用及區別
1、@RequestBody和@ResponseBody
@RequestBody (通過@requestBody可以將請求體中的JSON字串繫結到相應的bean上,當然,也可以將其分別繫結到對應的字串上。實質上接受的是一個JSON的字串)
1) 該註解用於讀取Request請求的body部分資料,使用系統預設配置的HttpMessageConverter進行解析,然後把相應的資料繫結到要返回的物件上;
2) 再把HttpMessageConverter返回的物件資料繫結到 controller中方法的引數上。
使用時機:
A) GET、POST方式提時, 根據request header Content-Type
application/x-www-form-urlencoded,可選(即非必須,因為這種情況的資料@RequestParam, @ModelAttribute也可以處理,當然@RequestBody也能處理);
multipart/form-data, 不能處理(即使用@RequestBody不能處理這種格式的資料);
其他格式, 必須(其他格式包括application/json, application/xml等。這些格式的資料,必須使用@RequestBody來處理);
@ResponseBody
Controller層為控制檢視層,當網頁端一個請求傳送到後臺時,後臺的控制檢視層通過
1、spring boot的啟動類
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(App.class);
ConfigurableApplicationContext context = app.run(args);
}
}
2、spring boot的控制檢視層
@Controller
public class MyController {
/*響應http://127.0.0.1:8080/hello請求*/
@RequestMapping("/hello")
@ResponseBody
public String hello(){
return "hello world";
}
}
當啟動啟動類後,在瀏覽器中輸入http://127.0.0.1:8080/hello時,控制檢視層響應請求後,把“hello world”字串返回到請求頁面上。@ResponseBody註解的作用就是把控制檢視方法返回的內容返回到請求頁面上。
注意,請求前後的url不改變。通過請求後的頁面可知,@ResponseBody註解把返回的字串“hello world”放到了請求返回頁面的<body></body> 標籤中了。
2、@PathVariable註解的使用
XXXController包括了常用的Get、Post、Put、Delete請求,並使用註解的方式說明了請求路徑
路徑中的{id}元素是路徑引數,可以通過@PathVariable註解獲取,具體的引數獲取與校驗會在下一篇做介紹。
總結
SpringBoot提供的獲取引數註解包括:@PathVariable,@RequestParam,@RequestBody,三者的區別如下表:
1.Get請求的引數可以通過@PathVariable和@RequestParam獲取
@GetMapping("/orders/{id}")
public String getOrder(@PathVariable(value = "id")Integer id,
@RequestParam(value = "name")String name,
@RequestParam(value = "price",required = false,defaultValue = "0") Integer price)
2.Post使用@RequestBody註解將Json格式的引數自動繫結到Entity類
@PostMapping("/order/check")
public String checkOrder(@RequestBody Order order)
3.Post使用@RequestParam獲取請求體中非Json格式的資料
@PostMapping("/order/checkmore")
public String checkMore(@RequestParam(value = "amount")Integer amount,
@RequestParam(value = "discount")float discount)
4.Post請求也可以直接與物件類繫結,但需要引數名一致,不支援json格式,只支援form-data和x-www.form-urlencoded格式
@PostMapping("/order/add")
public String addOrder(Order order)
5.Put請求可以直接與物件類繫結,但需要引數名一致
@PutMapping("/order/{id}/update")
public String updateOrder(@PathVariable(value = "id")Integer id,Order order)
注意點:
1.針對一些非必填的引數,可以使用required關鍵字來標識,同時必須設定預設值defaultValue,如getOrder方法中對price引數的獲取:
(@RequestParam(value = "price",required = false,defaultValue = "0") Integer price)
2.引數可以直接與Entity類繫結,但不支援json格式,只支援form-data和x-www.form-urlencoded格式
@PostMapping("/order/add")
public String addOrder(Order order){
4.增刪改查請求引數規範@PostMapping;@GetMapping;@PutMapping;@DeleteMapping
* 通過RestController註解告知SpringBoot這是一個控制器類
* 通過RequestMapping註解說明統一處理以user開頭的URL請求
*/
@RestController
@RequestMapping("/user")
public class UserController {
/**
* 獲取特定使用者
* @param id
* @return
*/
@GetMapping("/users/{id}")
public User getUser(@PathVariable(value="id") Integer id){
return null;
}
/**
* 新增使用者
* @param user
* @return
*/
@PostMapping("/add")
public String addUser(@RequestBody User user){
return "新增成功";
}
/**
* 修改使用者
* @param id
* @param user
* @return
*/
@PutMapping("/users/{id}/update")
public String updateUser(@PathVariable(value="id") Integer id,@RequestBody User user){
return "修改成功";
}
/**
* 刪除使用者
* @param id
* @return
*/
@DeleteMapping("/users/{id}/delete")
public String deleteUser(@PathVariable(value="id") Integer id){
return "刪除成功";
}
}