こんにちは!今回は、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-Agent
とAccept-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アノテーションの使い方と違いを解説!【初心者向け】