1. 概述
在本快速教程中,我們將探討如何在 Spring Rest Controller 中訪問 HTTP Headers。
首先,我們將使用 @RequestHeader 註解分別讀取和讀取所有 HTTP Headers。
之後,我們將更深入地研究 @RequestHeader 的屬性。
2. 訪問 HTTP 頭部
2.1. 獨立訪問
如果需要訪問特定的頭部,我們可以配置@RequestHeader,使用頭部名稱
@GetMapping("/greeting")
public ResponseEntity<String> greeting(@RequestHeader(HttpHeaders.ACCEPT_LANGUAGE) String language) {
// code that uses the language variable
return new ResponseEntity<String>(greeting, HttpStatus.OK);
}
然後我們可以使用傳遞到方法的變量訪問值。如果名稱為 accept-language 的頭部在請求中未找到,則方法返回“400 Bad Request”錯誤。
我們的頭部不必是字符串。如果知道我們的頭部是一個數字,我們可以將變量聲明為數字類型:
@GetMapping("/double")
public ResponseEntity<String> doubleNumber(@RequestHeader("my-number") int myNumber) {
return new ResponseEntity<String>(String.format("%d * 2 = %d",
myNumber, (myNumber * 2)), HttpStatus.OK);
}
2.2. 一次獲取所有
如果不知道哪些頭部會存在,或者需要比我們方法簽名中更多的頭部,我們可以使用 @RequestHeader 註解,而無需指定名稱。
我們有幾種選擇來定義變量類型:一個Map,MultiValueMap,或 HttpHeaders 對象。
首先,讓我們將請求頭作為 Map 獲取:
@GetMapping("/listHeaders")
public ResponseEntity<String> listAllHeaders(
@RequestHeader Map<String, String> headers) {
headers.forEach((key, value) -> {
LOG.info(String.format("Header '%s' = %s", key, value));
});
return new ResponseEntity<String>(
String.format("Listed %d headers", headers.size()), HttpStatus.OK);
}
如果使用 Map 並且其中一個頭部包含多個值,我們會只獲得第一個值。 這相當於使用 getFirst 方法在 MultiValueMap 中。
如果我們的頭部可能包含多個值,我們可以將其獲取為MultiValueMap:
@GetMapping("/multiValue")
public ResponseEntity<String> multiValue(
@RequestHeader MultiValueMap<String, String> headers) {
headers.forEach((key, value) -> {
LOG.info(String.format(
"Header '%s' = %s", key, value.stream().collect(Collectors.joining("|"))));
});
return new ResponseEntity<String>(
String.format("Listed %d headers", headers.size()), HttpStatus.OK);
}
我們也可以將我們的頭部作為 HttpHeaders 對象獲取:
@GetMapping("/getBaseUrl")
public ResponseEntity<String> getBaseUrl(@RequestHeader HttpHeaders headers) {
InetSocketAddress host = headers.getHost();
String url = "http://" + host.getHostName() + ":" + host.getPort();
return new ResponseEntity<String>(String.format("Base URL = %s", url), HttpStatus.OK);
}
HttpHeaders 對象具有訪問常見應用程序頭部的訪問器。
當我們從Map、MultiValueMap 或 HttpHeaders 對象中通過名稱訪問頭部時,我們會獲得null,如果它不存在。
3. 屬性
現在我們已經瞭解瞭如何使用 @RequestHeader 註解訪問請求頭的基本內容,接下來讓我們更詳細地瞭解它的屬性。
我們已經在明確指定頭名或值時隱式使用了 name 或 value 屬性:
public ResponseEntity<String> greeting(@RequestHeader(HttpHeaders.ACCEPT_LANGUAGE) String language) {}
我們可以通過使用 name 屬性來實現相同的功能:
public ResponseEntity<String> greeting(
@RequestHeader(name = HttpHeaders.ACCEPT_LANGUAGE) String language) {}
接下來,讓我們以相同的方式使用 value 屬性:
public ResponseEntity<String> greeting(
@RequestHeader(value = HttpHeaders.ACCEPT_LANGUAGE) String language) {}
當明確指定頭名時,該頭名是必需的。如果請求中未找到該頭,則控制器返回 400 錯誤。
讓我們使用 required 屬性來指示我們的頭名不是必需的:
@GetMapping("/nonRequiredHeader")
public ResponseEntity<String> evaluateNonRequiredHeader(
@RequestHeader(value = "optional-header", required = false) String optionalHeader) {
return new ResponseEntity<String>(String.format(
"Was the optional header present? %s!",
(optionalHeader == null ? "No" : "Yes")),HttpStatus.OK);
}
由於 null。">我們的變量將在頭名未出現在請求中時為 null。,因此我們需要確保進行適當的 null 檢查。
讓我們使用 defaultValue 屬性為我們的頭名提供默認值:
@GetMapping("/default")
public ResponseEntity<String> evaluateDefaultHeaderValue(
@RequestHeader(value = "optional-header", defaultValue = "3600") int optionalHeader) {
return new ResponseEntity<String>(
String.format("Optional Header is %d", optionalHeader), HttpStatus.OK);
}
4. 結論
在本教程中,我們學習瞭如何在 Spring REST 控制器中訪問請求頭。
首先,我們使用 @RequestHeader 註解為控制器的方法提供請求頭。
在瞭解了基本內容之後,我們對 @RequestHeader 註解的屬性進行了詳細研究。