目錄
- 1 請求分類
- 1.1 URL參數--查詢參數
- 1.2 URL參數--路徑參數
- 2 請求相關注解
- 2.1 @RequestParam--查詢參數
- 2.2 @PathVariable--路徑參數
- 2.3 @RequestBody
- 2.4 @Param & @RequestLine
- 2.5 SpringMVC請求參數注解用在FeignClient里
使用SpringMVC處理http請求或使用FeignClient進行請求時,會使用到許多請求相關注解,現梳理一下以免混亂。
1 請求分類
在進行HTTP請求時,會看到“請求參數”、“查詢參數”、“路徑參數”相關字眼,那么它們之間的關系是什么呢?——請求參數是更加寬泛的概念,它包括查詢參數和路徑參數,它是指在請求中傳遞給服務器的數據,可以是URL攜帶的參數,也可以是請求體,請求數據類型可以是路徑參數(rest風格)、查詢字符串、JSON數據等,適用于GET/POST/PUT/DELETE方法。
而查詢參數和路徑參數特指請求URL攜帶的參數。
1.1 URL參數–查詢參數
查詢參數一般特指使用GET請求、以URL傳遞的查詢字符串參數,它附加在URL里,參數位于URL的 “?” 之后,由一個或多個以 & 符號分隔的鍵值對組成。如:
https://example.com/api/users?age=30&sort=name
這個URL傳遞兩個參數age
和sort
,值分別是30
和name
。
1.2 URL參數–路徑參數
路徑參數常用在RESTful API風格中,它是URL路徑的一部分,一個形式化的路徑參數格式如下,路徑參數通常在大括號表示的地方:
https://example.com/api/users/{userId}
https://example.com/api/categories/{categoryId}/products
‘{}’
部分在請求時需要填入真實的值,比如:
https://example.com/api/users/1
https://example.com/api/categories/2024/products
2 請求相關注解
請求相關注解有不少,下面逐個介紹一下。
2.1 @RequestParam–查詢參數
在后端使用@RequestParam
來獲取查詢參數,對于如下請求路徑:
/api/users?sex=1&age1=30&sort=name
響應方式為:
@GetMapping("/api/users")
public List<User> getUsers(@RequestParam(required = false) int sex,@RequestParam(name= "age1", required = false) Integer age,@RequestParam("sort") String sort) {}
以上三種@RequestParam
的寫法都可以,required
字段默認為true
:
-
sex
: 當沒有給定任何注解屬性時,會默認將URL請求參數名和響應參數名稱進行映射,比如將請求參數sex
映射到后端參數sex
(參數名必須一致)。需要注意的是雖然參數為非必須,但用的是簡單類型進行接收,如果前端未傳sex
字段則會報錯,因為不能使用null
賦值給簡單類型。解決方式是可以使用defaultValue
屬性設置默認值或者使用包裝類型Integer
進行接收【defaultValue
和required = false
搭配使用】。當沒有顯示設置required
且前端未傳值時,也會嘗試賦空值。 -
age
: 顯示使用兩個屬性,name
規定將查詢參數“age1”
映射至后端參數“age”
。 -
sort
:比較常用的寫法。
2.2 @PathVariable–路徑參數
在后端使用@PathVariable
來獲取路徑參數,對于如下請求路徑:
/api/users/1
響應方式為:
@GetMapping("/api/users/{userId}")
public User getUserById(@PathVariable String userId) {}
注意路徑變量是URL的一部分,必須提供,因此@PathVariable
沒有required
屬性。
2.3 @RequestBody
用于將前端的請求體攜帶的JSON數據綁定到Java對象中。
@PostMapping("/api/users")public String createUser(@RequestBody User user) {}
2.4 @Param & @RequestLine
FeignClient提供的注解,在使用Feign客戶端的時候,這兩個注解常常搭配使用。
@Param
用于將方法參數綁定到請求的URL路徑參數、查詢參數或請求體中,像反向的@RequestParam
。
@RequestLine
在FeignClient里面定義HTTP請求的方法和路徑。
@FeignClient(name = "user-service", url = "http://localhost:8080")
public interface UserClient {// 使用 @RequestLine 定義HTTP請求方法和路徑@RequestLine("GET /users/{id}")User getUserById(@Param("id") Long id);
}
在使用feignclient的時候,如果@RequestLine
及@RequestMapping(method = RequestMethod.xxx)
(或@PostMapping/@GetMapping
)同時出現,會優先使用@RequestLine
。因為@RequestLine
屬于Feign原生注解,而@RequestMapping
屬于Spring MVC注解,因此Feign在處理請求時會優先選擇屬于自己的注解規則。
2.5 SpringMVC請求參數注解用在FeignClient里
@RequestParam
、@PathVariable
、@RequestBody
都屬于SpringMVC框架提供的注解,通常用于從請求里解析參數到后端方法參數,而當這些注解用在FeignClient里時,可以實現方法參數到請求的逆向綁定。
@FeignClient(name = "user-service", url = "http://localhost:8080")
public interface UserClient {// 1. @RequestParam:綁定查詢參數,將方法參數 name 綁定到查詢參數 name 上@GetMapping("/users/search")User searchUser(@RequestParam("name") String name);// 2. @PathVariable:綁定路徑變量,把方法參數 id 綁定到路徑變量 {id} 上@GetMapping("/users/{id}")User getUserById(@PathVariable("id") Long id);// 3. 綁定請求體,把方法參數 user 綁定到請求體上@PostMapping("/users")User createUser(@RequestBody User user);}