# @Request 觀念 spring的兩個註解: @RequestParam @RequestBody ### 1.@RequestParam 註解@RequestParam接收的參數是來自requestHeader中,即請求頭。通常用於GET請求,比如常見的url:http://localhost:8081/spring-boot-study/novel/findByAuthorAndType?author=唐家三少&type=已完結 ![](https://i.imgur.com/rRmQjEw.png) @RequestParam有三個配置參數: * required 表示是否必須,默認為 true,必須。 * defaultValue 可設置請求參數的默認值。 * value 為接收url的參數名(相當於key值)。 @RequestParam用來處理 Content-Type 為 application/x-www-form-urlencoded 編碼的內容,Content-Type 默認為該屬性。 @RequestParam也可用於其它類型的請求,例如:POST、DELETE等請求。 :::info 由於@RequestParam是用來處理 Content-Type 為 application/x-www-form-urlencoded 編碼的內容的,所以在postman中,要選擇body的類型為 x-www-form-urlencoded,這樣在headers中就自動變為了 Content-Type : application/x-www-form-urlencoded 編碼格式。 ::: :::warning 如果改用 json 字符串來傳值的話,類型設置為 application/json,點擊發送的話,會報錯,後台接收不到值,為 null。 ::: ### 2.@RequestBody 註解@RequestBody接收的參數是來自requestBody中,即請求體。一般用於處理非 Content-Type: application/x-www-form-urlencoded編碼格式的數據,比如:application/json、application/xml等類型的數據。 就application/json類型的數據而言,使用註解@RequestBody可以將body裡面所有的json數據傳到後端,後端再進行解析。 ![](https://i.imgur.com/OMBQC9u.png) :::info 由於@RequestBody可用來處理 Content-Type 為 application/json 編碼的內容,所以在postman中,選擇body的類型為row -> JSON(application/json),這樣在 Headers 中也會自動變為 Content-Type : application/json 編碼格式。 ::: ### 3.後端解析json數據 通常是藉由設定 String 型態,來接收json字串 再去建立一個 view class 類別,並使用 gson 來解析 ### 4.總結 註解@RequestParam接收的參數是來自requestHeader中,即請求頭。通常用於GET請求,像POST、DELETE等其它類型的請求也可以使用。 註解@RequestBody接收的參數是來自requestBody中,即請求體。一般用於處理非 Content-Type: application/x-www-form-urlencoded編碼格式的數據,比如:application/json、application/xml等類型的數據。通常用於接收POST、DELETE等類型的請求數據,GET類型也可以適用。 # @RestController 從Spring MVC 4.0的多了@RestController,與傳統@Controller的差別其實只是@RestController等於@Controller搭配@ResponseBody。 在撰寫RESTful API時,因為通常都是回傳json或xml,所以回傳無須交由View Resolver處理來返回頁面,所以會在Controller的API方法前加上@Responsebody來達成 ```java= @Controller @RequestMapping(value="/api/user") public class UserController { @Autowired UserService userService; @RequestMapping(value="/all", method=RequestMethod.GET, produces=MediaType.APPLICATION_JSON_UTF8_VALUE) @ResponseBody public List<User> getUserJson(Model model){ return userService.getAllUser(); } } ``` 而在4.0後可改用@RestController,則該Controller類別中的方法回傳值都將預設為@ResponseBody,所以原本方法前的@ResponseBody就可以拿掉了。 ```java= @RestController @RequestMapping(value="/api/user") public class UserController { @Autowired UserService userService; @RequestMapping(value="/all", method=RequestMethod.GET, produces=MediaType.APPLICATION_JSON_UTF8_VALUE) public List<User> getUserJson(Model model){ return userService.getAllUser(); } } ``` :::info 另外Spring MVC 4.3還多了@GetMapping,@PostMapping,@PutMapping,@DeleteMapping,@PatchMapping等對應RESTful API的HTTP method:GET,POST,PUT,DELETE,PATCH等,所以搭配以上就可以省略method的宣告了。 ```java= @RestController @RequestMapping(value="/api/user") public class UserController { @Autowired UserService userService; @GetMapping(value="/all", produces=MediaType.APPLICATION_JSON_UTF8_VALUE) public List<User> getUserJson(Model model){ return userService.getAllUser(); } } ``` ::: #### 預設的Request方法 :::info 如果沒有指定method的宣告,將會解析所有 http request,例如你可以傳送GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE request到指定的url,會被自動解析。 ::: 資料來源: [註解@RequestParam與@RequestBody的使用場景](https://kknews.cc/zh-tw/code/jkrn93l.html) [Spring MVC @RestController與@Controller的區別 ](https://matthung0807.blogspot.com/2018/03/spring-mvc-restcontrollercontroller.html) ###### tags: `Spring boot` `RequestBody` `RequestBody`