一、背景
項目開發中經常使用Spring Boot開發API,所以讀取請求參數是服務端編碼中最基本最常見的操作項,Spring Boot中也提供多種機制來滿足不同的API設計要求。接下來就記錄一下項目中用過的6種請求參數讀取方式。
@RequestParam
用來加載請求URL中"?"之后的參數。比如:這個請求 /user?name=abc 就可以如下面這樣,使用@RequestParam來加載URL中的name參數:
@GetMapping("/user")
@ResponseBody
public User findUserByName(@RequestParam("name") String name){ return userRepo.findByName(name);
}
@PathVariable
RESTful風格API中常用的注解,用來加載URL路徑中的參數。比如:這個請求/user/1 就可以如下面這樣,使用@PathVariable來加載URL中的id參數:
@GetMapping("/user/{id}")
@ResponseBody
public User findUserById(@PathVariable("id") String id){ return userRepo.findById(id);
}
@MatrixVariable
用的并不是很多,有些國外系統有提供這類API參數,這種API的參數通過;分割。
比如:請求/books/reviews;id=1234;topN=5; 就可以如下面這樣,使用@MatrixVariable來加載URL中用;分割的參數:
@GetMapping("/books/reviews")
@ResponseBody
public List<BookReview> getBookReviews( @MatrixVariable String id, @MatrixVariable Integer topN) {return bookReviewsLogic.getTopNReviewsByIsbn(isbn, topN);
}
@RequestBody
用來加載POST/PUT請求的復雜請求體(也叫:payload)。比如,客戶端需要提交一個復雜數據的時候,就要將這些數據放到請求體中,然后服務端用@RequestBody來加載請求體中的數據
@PostMapping("/add")
public boolean addAccounts(@RequestBody List<Account> accounts) throws SQLException {accounts.stream().forEach(a -> {a.setCreatedOn(Timestamp.from(Instant.now()));a.setLastLogin(Timestamp.from(Instant.now()));});return notificationLogic.addAccounts(accounts);
}
@RequestHeader
用來加載請求頭中的數據,在業務系統中不太使用,但在基礎設施的建設中或者鑒權請求中會比較常用,比如傳遞分布式系統的TraceID等。比如,假設將鑒權數據存在http請求頭中,就可以用@RequestHeader來加載請求頭中的Authorization參數:
@GetMapping("/user")
@ResponseBody()
public List<User> getUserList(@RequestHeader("Authorization") String authToken) {return userRepo.findAll();
}
@CookieValue
需要與客戶端保持有狀態的交互時,就需要用到Cookie。此時,服務端讀取Cookie數據的時候,就可以用@CookieValue來讀取Cookie中的SessionId數據:
@GetMapping("/user")
@ResponseBody()
public List<User> getUserList(@CookieValue(name = "SessionId") String sessionId) {return userRepo.findAll();
}