# @Request 觀念
spring的兩個註解:
@RequestParam
@RequestBody
### 1.@RequestParam
註解@RequestParam接收的參數是來自requestHeader中,即請求頭。通常用於GET請求,比如常見的url:http://localhost:8081/spring-boot-study/novel/findByAuthorAndType?author=唐家三少&type=已完結

@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數據傳到後端,後端再進行解析。

:::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`