- Spring Boot進階:原理、實戰與面試題分析
- 鄭天民
- 937字
- 2022-07-05 09:41:52
4.1.1 創建Web服務
在Spring Boot中,創建Web服務的主要工作是實現Controller。而在創建Controller之后,需要對HTTP請求進行處理并返回正確的響應結果。我們可以基于一系列注解來開展這些開發工作。
1. 創建Controller
創建Controller的過程比較固定,我們已經在第1章中實現過一個簡單的Controller,如代碼清單4-1所示。
代碼清單4-1 UserController示例代碼
@RestController @RequestMapping(value="users") public class UserController { @GetMapping(value = "/{id}") public User getUserById(@PathVariable Long id) { User user = new User(); ... return user; } }
這是一個典型的Controller,可以看到上述代碼包含了@RestController、@Request-Mapping和@GetMapping等注解。其中,@RestController注解繼承自Spring WebMVC中的@Controller注解,顧名思義就是一個RESTful風格的HTTP端點,并且會自動使用JSON實現HTTP請求和響應的序列化/反序列化。根據這一特性,我們在構建Web服務時可以使用@RestController注解來取代@Controller注解以簡化開發。
@GetMapping注解和@RequestMapping注解的功能類似,只是默認使用Request-Method.GET來指定HTTP方法。Spring Boot 2引入了一批新注解,除了@GetMapping外還有@PutMapping、@PostMapping、@DeleteMapping等,方便開發人員顯式指定HTTP請求方法。當然,我們也可以繼續使用原先的@RequestMapping注解來實現同樣的效果。
在上述UserController中,我們通過靜態代碼完成根據用戶ID獲取用戶信息的業務流程。這里用到了兩層Mapping,第一層的@RequestMapping注解在服務層級定義了服務的根路徑users,而第二層的@GetMapping注解則在操作級別又定義了HTTP請求方法的具體路徑及參數信息。
2. 處理Web請求
處理Web請求的過程涉及獲取輸入參數以及返回響應結果。Spring Boot提供了一系列便捷有用的注解來簡化對請求輸入的控制過程,常用的包括上述UserController中所展示的@PathVariable和@RequestBody。
@PathVariable注解用于獲取路徑參數,即從類似url/{id}這種形式的路徑中獲取{id}參數的值。通常,使用@PathVariable注解時只需要指定參數的名稱即可。代碼清單4-2是使用@PathVariable注解的典型代碼示例,這里在請求路徑中同時傳入了兩個參數。
代碼清單4-2 @PathVariable注解使用的示例代碼
@PostMapping(value = "/{username}/{password}") public User generateUser(@PathVariable("username") String username, @PathVariable("password") String password) { User user = userService.generateUser(username, password); return user; }
在HTTP中,content-type屬性用來指定所傳輸的內容類型。而我們可以通過@Request-Mapping注解中的produces屬性來對其進行設置,通常會將其設置為application/json,示例代碼如代碼清單4-3所示。
代碼清單4-3 content-type屬性使用的示例代碼
@RestController @RequestMapping(value = "users", produces="application/json") public class UserController { }
而@RequestBody注解就是用來處理content-type為application/json類型時的請求內容。通過@RequestBody注解可以將請求體中的JSON字符串綁定到相應的實體對象上。我們可以對前面的generateUser()方法進行重構,通過@RequestBody注解來傳入參數,如代碼清單4-4所示。
代碼清單4-4 @RequestBody注解使用的示例代碼
@PostMapping(value = "/") public User generateUser(@RequestBody User user) { }
這時候,如果想要通過Postman來發起這個POST請求,就需要使用如代碼清單4-5所示的一段JSON字符串。
代碼清單4-5 請求JSON字符串示例
{ "username": "tianyalan", "password":"123456" }