@RequestHeaderの使い方と引数を徹底解説!【初心者向け】

こんにちは!今回は、Spring FrameworkでHTTPリクエストのヘッダーを簡単に取得するためのアノテーション、@RequestHeaderについて詳しく解説します。@RequestHeaderを使えば、リクエストヘッダーに含まれる情報(例えば認証情報やクライアントの設定など)を簡単に取得でき、柔軟な処理が可能になります。

@RequestHeaderとは?

@RequestHeaderとは、「リクエストの中に入っている情報(ヘッダー)を取り出す」ことができるアノテーションです。

リクエストヘッダーには、ユーザーエージェントや認証トークン、コンテンツタイプなどの情報が含まれます。これらの情報を使って、リクエストに基づいた処理を行うことができます。

基本的な使い方

たとえば、特定の人だけがアクセスできる情報を守るために、「トークン(秘密の鍵)」を使います。このトークンが正しいかどうかを確認する例です。

サーバー側のコード

@RestController
@RequestMapping("/api")
public class UserController {

    @GetMapping("/profile")
    public String getProfile(@RequestHeader("Authorization") String token) {
        if ("my-secret-token".equals(token)) {
            return "こんにちは!あなたのプロフィールです";
        }
        return "アクセスできません!トークンが違います";
    }
}

リクエスト側のコード

クライアント側では、fetch APIを使ってリクエストヘッダーを設定して送信します。

GET http://localhost:8080/api/profile
Headers:
Authorization: my-secret-token

説明: @RequestHeader("Authorization")で、「Authorization」というヘッダーに入っているトークンを取り出しています。トークンが正しければ「プロフィール」を返し、間違っていれば「アクセスできません!」と返します。

返却されるステータスコード一覧

APIを使うと、サーバーからいろいろなステータスコードが返ってきます。これらはリクエストが成功したか失敗したか、問題が何だったのかを教えてくれる「メッセージ」です。以下に、よく使われるステータスコードの説明をまとめます。

ステータスコード意味説明
200 OK成功リクエストが成功し、期待通りのレスポンスが返されました。
201 Created作成成功新しいリソースが正常に作成されました(例: 新しいユーザー登録)。
204 No Contentコンテンツなしリクエストは成功しましたが、返すデータはありません。
400 Bad Requestリクエストエラークライアントのリクエストが不正です(例: フォーマットミス)。
401 Unauthorized認証失敗認証が必要ですが、認証情報が正しくない、または不足しています。
403 Forbiddenアクセス拒否権限がないため、リソースへのアクセスが禁止されています。
404 Not Found見つからないリクエストしたリソースが存在しません(例: 間違ったURL)。
405 Method Not Allowedメソッド使用不可指定したHTTPメソッド(GET, POSTなど)が許可されていません。
409 Conflict競合リクエストが現在のサーバーの状態と競合しています(例: 重複データ)。
500 Internal Server Errorサーバーエラーサーバー内部で問題が発生しました(例: プログラムのバグ)。
502 Bad Gateway不正なゲートウェイサーバーが上位のサーバーからの無効な応答を受け取りました。
503 Service Unavailableサービス利用不可サーバーが一時的に使用できません(例: メンテナンス中)。

@RequestHeaderの使い方【応用編】

@RequestHeaderを使ったヘッダーの処理は、以下のように応用することができます。

1. ヘッダーがオプショナルな場合

@RequestHeaderでは、ヘッダーがリクエストに含まれていない場合でも、デフォルト値を設定することができます。

@RequestMapping("/header-example")
public ResponseEntity<String> getHeaderInfo(@RequestHeader(value = "User-Agent", defaultValue = "Unknown") String userAgent) {
    return ResponseEntity.ok("User-Agent: " + userAgent);
}

ここでは、User-Agentヘッダーが存在しない場合、デフォルトで"Unknown"を設定しています。

2. 複数のヘッダーを取得する

複数のヘッダーを同時に取得することも可能です。

@RequestMapping("/multiple-headers")
public ResponseEntity<String> getMultipleHeaders(
        @RequestHeader("User-Agent") String userAgent, 
        @RequestHeader("Accept-Language") String language) {
    return ResponseEntity.ok("User-Agent: " + userAgent + ", Accept-Language: " + language);
}

この例では、User-AgentAccept-Languageの両方をリクエストヘッダーから取得しています。

3. ヘッダーの型を指定する

ヘッダーの値を特定の型に変換することもできます。例えば、整数の値を@RequestHeaderで取得したい場合です。

@RequestMapping("/content-length")
public ResponseEntity<String> getContentLength(@RequestHeader("Content-Length") int contentLength) {
    return ResponseEntity.ok("Content-Length: " + contentLength);
}

ここでは、Content-Lengthヘッダーの値をint型として受け取ります。

@RequestHeaderの引数

@RequestHeaderにはいくつかの属性があり、リクエストヘッダーをより細かく制御できます。

1. value属性

value属性で、取得したいヘッダー名を指定します。

@RequestMapping("/get-header")
public ResponseEntity<String> getHeader(@RequestHeader("Authorization") String authToken) {
    return ResponseEntity.ok("Authorization header: " + authToken);
}

2. defaultValue属性

defaultValue属性を使うことで、リクエストヘッダーが存在しない場合のデフォルト値を設定できます。

@RequestMapping("/get-header")
public ResponseEntity<String> getHeader(@RequestHeader(value = "X-Custom-Header", defaultValue = "default-value") String customHeader) {
    return ResponseEntity.ok("Custom Header: " + customHeader);
}

3. required属性

required属性で、リクエストヘッダーが必須かどうかを指定できます。デフォルトではtrueですが、falseに設定することで、ヘッダーがなくてもエラーが発生しません。

@RequestMapping("/get-header")
public ResponseEntity<String> getHeader(@RequestHeader(value = "X-Custom-Header", required = false) String customHeader) {
    return ResponseEntity.ok("Custom Header: " + (customHeader == null ? "No header" : customHeader));
}

おわりに

@RequestHeaderを使うことで、リクエストヘッダーから簡単に情報を取得でき、柔軟な処理が可能になります。ヘッダー情報をもとに認証や条件分岐を行うことが多いため、REST APIの開発において非常に重要な要素です。今回は基本的な使い方から応用例まで紹介しましたので、ぜひコードを実際に試してみてください!

もっと詳しく知りたい方は、Spring公式ドキュメントを見てみてくださいね。

他の記事が見たい方はこちら!↓↓↓

@GroupSequenceの使い方と引数を徹底解説!【初心者向け】

@AssertTrueと@AssertFalseの使い方と違いを徹底解説!【初心者向け】

@Max, @Min, @Sizeアノテーションの使い方と違いを解説!【初心者向け】

@NotNull、@NotBlank、@NotEmptyの違いは?【初心者向け】

@DateTimeFormatと@NumberFormatの使い方徹底解説!

タイトルとURLをコピーしました