如何在 Spring REST Controller 中獲取 HTTP 頭信息

介紹

在本篇文章中,咱們將研究如何在 Spring Rest Controller 中訪問 HTTP 頭信息。
首先,咱們將使用 @RequestHeader 註解分別或同時讀取 HTTP 頭信息。
以後,咱們將深刻研究 @RequestHeader 的屬性。java

獲取 HTTP 頭信息

獲取單個 HTTP 頭信息

若是咱們須要訪問一個特定的 HTTP 頭信息,咱們能夠用頭名配置 @RequestHeaderapp

@GetMapping("/greeting")
public ResponseEntity<String> greeting(@RequestHeader("accept-language") String language) {
    // 使用 language 變量的代碼
    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);
}

獲取多個 HTTP 頭信息

若是咱們不肯定會出現哪些頭文件,或者咱們須要的頭文件比方法簽名中須要的多,咱們可使用 @RequestHeader 註釋,而不須要特定的名稱。
對於變量類型,咱們有幾種選擇:Map,MultiValueMap 或 HttpHeaders 對象。
首先,讓咱們以 Map 的形式獲取請求的頭信息:ui

@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,而且其中一個頭信息具備多個值,則只能得到第一個值。這等效於在 MultiValueMap 上使用 getFirst() 方法。
若是咱們的頭信息可能有多個值,咱們能夠將它們做爲 MultiValueMap 進行獲取:lua

@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);
}

咱們還能夠將 headers 做爲 HttpHeaders 對象獲取:url

@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);
}

當咱們從 Map,MultiValueMap 或 HttpHeaders 對象中按名稱訪問頭信息時,若是不存在則返回空。code

@RequestHeader 屬性

如今,咱們已經瞭解了使用 @RequestHeader 註解獲取請求頭的基礎知識,讓咱們仔細看一下其屬性。
當咱們指定 Header 時,咱們已經隱式地使用了 name 或 value 屬性:orm

public ResponseEntity<String> greeting(
  @RequestHeader("accept-language") String language) {}

咱們能夠經過使用 name 屬性來完成一樣的事情:對象

public ResponseEntity<String> greeting(
  @RequestHeader(name = "accept-language") String language) {}

接下來,讓咱們以徹底相同的方式使用 value 屬性:blog

public ResponseEntity<String> greeting(
  @RequestHeader(value = "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, 所以確保程序可以正常運行,咱們進行適當的空值檢查。
讓咱們使用 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);
}

結束語

在這個簡短的教程中,咱們學習瞭如何在 Spring REST Controllers 中訪問請求頭。首先,咱們使用 @RequestHeader 註解爲 Controller 方法獲取請求頭。
在瞭解了基礎知識以後,咱們詳細研究了 @RequestHeader 註解的屬性。

歡迎關注個人公衆號:曲翎風,得到獨家整理的學習資源和平常乾貨推送。
若是您對個人專題內容感興趣,也能夠關注個人博客: sagowiec.com
相關文章
相關標籤/搜索