Spring RESTコントローラーでHTTPヘッダーを読み取る方法

1. 前書き

このクイックチュートリアルでは、https://www.baeldung.com/rest-with-spring-series [Spring Rest Controller]でHTTPヘッダーにアクセスする方法を説明します。
最初に、_ @ RequestHeader_アノテーションを使用して、ヘッダーを個別に読み取り、すべて一緒に読み取ります。
その後、_ @RequestHeader_âsの属性をさらに詳しく見ていきます。

2. HTTPヘッダーへのアクセス

2.1. 個別に

特定のヘッダーにアクセスする必要がある場合は、*ヘッダー名で_ @ RequestHeader_を構成できます:*
@GetMapping("/greeting")
public ResponseEntity<String> greeting(@RequestHeader("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_を使用し、ヘッダーの1つに複数の値がある場合**、最初の値のみを取得します**。 これは、_MultiValueMap_で_getFirst_メソッドを使用することと同等です。
*ヘッダーに複数の値がある場合、_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_属性

_ @ RequestHeader_アノテーションを使用してリクエストヘッダーにアクセスする基本について説明したので、その属性を詳しく見てみましょう。
ヘッダーに特に名前を付けたときに、_name_属性または_value_属性を暗黙的に使用しました。
public ResponseEntity<String> greeting(@RequestHeader("accept-language") String language) {}
_name_属性を使用して同じことを実現できます。
public ResponseEntity<String> greeting(@RequestHeader(name = "accept-language") String language) {}
次に、_value_属性をまったく同じ方法で使用します。
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_になるので、適切な_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_アノテーションの属性を詳細に調べました。
サンプルコードはhttps://github.com/eugenp/tutorials/tree/master/spring-mvc-simple-2[over on GitHub]で入手できます。