1. 程式人生 > >【springboot】@RequestBody和@ResponseBody以及@PathVariable的使用及區別

【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層為控制檢視層,當網頁端一個請求傳送到後臺時,後臺的控制檢視層通過

@RequestMapping對映相應的檢視方法,如果在檢視方法上用註解@ResponseBody標識後,方法執行完後返回的內容會返回到請求頁面的body上,直接顯示在網頁上。示例如下

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 "刪除成功";

     }

 }