在本篇文章中,咱們將研究如何在 Spring Rest Controller 中訪問 HTTP 頭信息。
首先,咱們將使用 @RequestHeader 註解分別或同時讀取 HTTP 頭信息。
以後,咱們將深刻研究 @RequestHeader 的屬性。java
若是咱們須要訪問一個特定的 HTTP 頭信息,咱們能夠用頭名配置 @RequestHeader:app
@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); }
若是咱們不肯定會出現哪些頭文件,或者咱們須要的頭文件比方法簽名中須要的多,咱們可使用 @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 註解獲取請求頭的基礎知識,讓咱們仔細看一下其屬性。
當咱們指定 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