---
# System prepended metadata

title: '@Request 觀念'
tags: [Spring boot, RequestBody]

---

# @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`