在 Spring REST 控制器中讀取 HTTP 頭部

REST,Spring Web
Remote
1
08:52 AM · Dec 01 ,2025

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 註解,而無需指定名稱。

我們有幾種選擇來定義變量類型:一個MapMultiValueMap,或 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 對象具有訪問常見應用程序頭部的訪問器。

當我們從MapMultiValueMapHttpHeaders 對象中通過名稱訪問頭部時,我們會獲得null,如果它不存在。

3. 屬性

現在我們已經瞭解瞭如何使用 @RequestHeader 註解訪問請求頭的基本內容,接下來讓我們更詳細地瞭解它的屬性。

我們已經在明確指定頭名或值時隱式使用了 namevalue 屬性:

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 註解的屬性進行了詳細研究。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.