ステータスコードチートシート[ステータスコードは開発者の共通言語！]

ステータスコードって知っていますか？私は開発者として知っている1つの共通言語だと思う．知っておくことは必須級であると思う．本記事ではステータスコードについての説明から，対処法まで説明する．

# 他のチートシート
Dockerコマンド

https://qiita.com/JavaLangRuntimeException/items/21f7c7bf3d143f821697

TypeScript

https://qiita.com/JavaLangRuntimeException/items/5894391c08e0d8e28389

Go/Gorm

https://qiita.com/JavaLangRuntimeException/items/d388717fc1436bc3ec9d



C#/.NET/Unity

https://qiita.com/JavaLangRuntimeException/items/7849b32bc223d4aa0247

Ruby・Ruby on Rails

https://qiita.com/JavaLangRuntimeException/items/42d935cf92c212f1c7ec

git/gh コマンド

https://qiita.com/JavaLangRuntimeException/items/6b46551f56e0def76eba

lazygit

https://qiita.com/JavaLangRuntimeException/items/42087d09728d5739d73d

SQL

https://qiita.com/JavaLangRuntimeException/items/f038fbaccdd92fb0308a

プルリクエスト・マークダウン記法チートシート

https://qiita.com/JavaLangRuntimeException/items/329eb92a47a07ff4dde8

ファイル操作コマンドチートシート

https://qiita.com/JavaLangRuntimeException/items/16f244606a73f7d106e4

VSCode Github Copilot拡張機能

https://qiita.com/JavaLangRuntimeException/items/be13dc3a346cf6e5ee44

Vim 

https://qiita.com/JavaLangRuntimeException/items/0c68ab96ea198e0a7294

OpenAI Assistants API

https://qiita.com/JavaLangRuntimeException/items/1a1abc01e8d7d05dce93

Github API

https://qiita.com/JavaLangRuntimeException/items/4f3551c31679233219ac

変数・関数(メソッド)・クラス命名規則

https://qiita.com/JavaLangRuntimeException/items/b93865c448f69bcfca4a


# 他のシリーズ記事
**TypeScriptで学ぶプログラミングの世界**
プログラミング言語を根本的に理解するシリーズです．

https://qiita.com/JavaLangRuntimeException/items/cadf49bb419076819963

**情報処理技術者試験合格への道[IP・SG・FE・AP]**
情報処理技術者試験に出題されるコンピュータサイエンス用語の紹介や単語集

https://qiita.com/JavaLangRuntimeException/items/991be402099542ccb936

**IAM AWS User クラウドサービスをフル活用しよう！**
AWSのサービスを例にしてバックエンドとインフラ開発の手法を説明するシリーズです．

https://qiita.com/JavaLangRuntimeException/items/371a334f5a6e07035db5

**AWS UserのGCP浮気日記**
GCPの様子をAWSと比較して考えてみるシリーズ

https://qiita.com/JavaLangRuntimeException/items/527d99e774165a763180

**Project Gopher: Unlocking Go’s Secrets**
Go言語や標準ライブラリの深掘り調査レポートです．

https://qiita.com/JavaLangRuntimeException/items/dc45b412d3fbd2ccb9e8

**Gopher’s Journey: Exploring TCP Protocol**
Goを用いてTCPプロトコルを探求 & 作成するシリーズです．

https://qiita.com/JavaLangRuntimeException/items/38091220106d86651d2b

# HTTPステータスコードとは

HTTPステータスコードは，Webサーバーからクライアントへのレスポンスの状態を示す3桁の数字である．これらのコードは，HTTPリクエストの結果を簡潔に表現し，クライアントに対してサーバーの応答状態を伝える重要な役割を果たす．

## 主な特徴

### 1. 3桁の数字で構成
   - 1桁目がクラスを示し，2桁目と3桁目が詳細な状態を示す．

### 2. 5つの主要クラス
   - 1xx: 情報
   - 2xx: 成功
   - 3xx: リダイレクト
   - 4xx: クライアントエラー
   - 5xx: サーバーエラー

### 3. 標準化
   - Internet Engineering Task Force (IETF) によって標準化されている．
   - HTTP/1.1 の仕様に定義されている．

### 4. 拡張性
   - 新しいステータスコードを追加することができる．

### 5. テキスト説明
   - 各ステータスコードには短いテキスト説明（リーズンフレーズ）が付随する．

## ステータスコードの役割

### 1. 通信状態の明確化
   - リクエストの成功や失敗，追加のアクションの必要性を示す．

### 2. エラー診断
   - 問題が発生した場合，その原因を特定するのに役立つ．

### 3. プログラムの制御
   - クライアントアプリケーションがステータスコードに基づいて動作を変更できる．

### 4. ブラウザの動作制御
   - ブラウザはステータスコードに基づいて特定のアクションを実行する．

### 5. SEOへの影響
   - 検索エンジンはステータスコードを利用してウェブページの状態を理解する．

### 6. キャッシュ制御
   - 特定のステータスコード（例：304 Not Modified）はキャッシュの動作に影響を与える．

## 例

- 200 OK: リクエストが成功した．
- 404 Not Found: リクエストされたリソースが見つからない．
- 500 Internal Server Error: サーバー内部でエラーが発生した．

これは後で説明する．

# HTTPステータスコードを学ぶ意義
ステータスコードを学ぶ意義は多岐にわたるが一旦まとめてみる
## 1. 効率的なトラブルシューティング
   - **問題の迅速な特定:** ステータスコードを理解することで，ウェブアプリケーションやAPIの問題を素早く特定できる．
   - **的確な対応:** 各コードの意味を知ることで，適切な対処方法を迅速に選択できる．

## 2. ユーザー体験の向上
   - **エラーメッセージの改善:** 適切なステータスコードに基づいて，ユーザーにわかりやすいエラーメッセージを提供できる．
   - **リダイレクトの適切な処理:** 3xxコードを正しく扱うことで，スムーズなナビゲーションを実現できる．

## 3. セキュリティの強化
   - **脆弱性の把握:** 特定のステータスコード（例：401，403）を適切に使用することで，セキュリティ上の問題を明確に示せる．
   - **情報漏洩の防止:** ステータスコードを適切に設定することで，不要な情報の露出を防ぐことができる．

## 4. APIの設計と開発
   - **RESTful API設計:** 適切なステータスコードを使用することで，直感的で標準的なAPIを設計できる．
   - **クライアント側の処理の最適化:** クライアントアプリケーションがステータスコードに基づいて適切に動作するよう設計できる．

## 5. パフォーマンスの最適化
   - **キャッシュの適切な利用:** 304 Not Modifiedなどのコードを活用し，ネットワークトラフィックを削減できる．
   - **リソース利用の効率化:** 適切なステータスコードを返すことで，不要な再試行や処理を防ぐことができる．

## 6. コミュニケーションの円滑化
   - **開発者間の共通言語:** ステータスコードは開発者間で広く理解されている共通言語であり，コミュニケーションを容易にする．
   - **クライアント-サーバー間の明確な情報交換:** ステータスコードにより，クライアントとサーバー間で状況を明確に伝達できる．

## 7. 標準規格への準拠
   - **互換性の確保:** HTTPの標準に準拠することで，異なるシステム間の互換性を高めることができる．
   - **将来の拡張性:** 新しいステータスコードが追加された際にも，スムーズに対応できる．

## 8. モニタリングと分析の改善
   - **システムの健全性評価:** ステータスコードの分布を分析することで，システムの全体的な健全性を評価できる．
   - **ユーザー行動の理解:** 特定のステータスコードの頻度を監視することで，ユーザーの行動パターンや問題を把握できる．

# HTTPステータスコード一覧と対処例

## 1xx 情報
### 100 Continue
- **説明:** リクエストの継続を示す．

### 101 Switching Protocols
- **説明:** プロトコルの切り替えを要求する．

### 102 Processing
- **説明:** サーバーがリクエストを処理中であることを示す．

### 103 Early Hints
- **説明:** レスポンスのヘッダーを先行して送信する．

## 2xx 成功

### 200 OK
- **説明:** リクエストが成功した．
- **対処例:** 正常に処理されたため，特別な対処は不要である．

### 201 Created
- **説明:** リクエストが成功し，新しいリソースが作成された．
- **対処例:** 新しく作成されたリソースのURIを確認し，必要に応じて利用する．

### 202 Accepted
- **説明:** リクエストは受け入れられたが，処理はまだ完了していない．
- **対処例:** 処理の完了を待つ，または後で結果を確認する．

### 203 Non-Authoritative Information
- **説明:** 返された情報は元のサーバーからのものではない．
- **対処例:** 情報の信頼性を考慮し，必要に応じて元のソースを確認する．

### 204 No Content
- **説明:** リクエストに対するボディを含まないレスポンス．
- **対処例:** クライアントの状態を更新せず，現在のビューを維持する．

### 205 Reset Content
- **説明:** ブラウザのビューをリセットするよう指示する．
- **対処例:** フォームの入力欄をクリアするなど，ビューをリセットする．

### 206 Partial Content
- **説明:** 部分的なGETリクエストが成功した．
- **対処例:** 受信したコンテンツの範囲を確認し，必要に応じて残りの部分をリクエストする．

### 207 Multi-Status
- **説明:** 複数のステータスを含む．
- **対処例:** 各リソースのステータスを個別に確認し，適切に処理する．

### 208 Already Reported
- **説明:** DAV binding memberが既に列挙されている．
- **対処例:** 重複を避けるため，既に報告された情報を無視する．

### 226 IM Used
- **説明:** GETリクエストに対する応答が1つ以上の操作の結果である．
- **対処例:** サーバーが適用した変換を考慮してコンテンツを処理する．

## 3xx リダイレクト

### 300 Multiple Choices
- **説明:** リクエストに対して複数の選択肢がある．
- **対処例:** ユーザーに選択肢を提示するか，デフォルトの選択肢を自動的に選ぶ．

### 301 Moved Permanently
- **説明:** リソースが恒久的に移動した．
- **対処例:** 新しいURLを使用するようにリンクを更新する．

### 302 Found
- **説明:** リソースが一時的に移動した．
- **対処例:** 提供された新しいURLにリクエストを再送信する．

### 303 See Other
- **説明:** 別のURLにGETリクエストを送るよう指示する．
- **対処例:** 指定されたURLに新しいGETリクエストを送信する．

### 304 Not Modified
- **説明:** リソースは変更されていない．
- **対処例:** キャッシュされたバージョンを使用する．

### 305 Use Proxy
- **説明:** プロキシを使用してリソースにアクセスする必要がある．
- **対処例:** 指定されたプロキシを通じてリソースにアクセスする．

### 307 Temporary Redirect
- **説明:** 一時的なリダイレクト．
- **対処例:** 元のリクエストメソッドを維持したまま，新しいURLにリクエストを再送信する．

### 308 Permanent Redirect
- **説明:** 恒久的なリダイレクト．
- **対処例:** 元のリクエストメソッドを維持したまま，新しいURLにリクエストを再送信し，リンクを更新する．

## 4xx クライアントエラー

### 400 Bad Request
- **説明:** サーバーがリクエストを理解できない．
- **対処例:** リクエストの構文を確認し，修正する．

### 401 Unauthorized
- **説明:** 認証が必要である．
- **対処例:** 適切な認証情報を提供してリクエストを再試行する．

### 402 Payment Required
- **説明:** 将来の使用のために予約されている．
- **対処例:** 現在は一般的に使用されていないが，支払いが必要な場合は指示に従う．

### 403 Forbidden
- **説明:** アクセスが禁止されている．
- **対処例:** アクセス権限を確認し，必要に応じて権限を取得する．

### 404 Not Found
- **説明:** リソースが見つからない．
- **対処例:** URLが正しいか確認し，存在しないリソースへのリンクを修正する．

### 405 Method Not Allowed
- **説明:** 許可されていないHTTPメソッドである．
- **対処例:** 適切なHTTPメソッドを使用してリクエストを再送信する．

### 406 Not Acceptable
- **説明:** 受け入れ可能なレスポンスがない．
- **対処例:** クライアントの受け入れ条件を緩和するか，サーバーの設定を変更する．

### 407 Proxy Authentication Required
- **説明:** プロキシでの認証が必要である．
- **対処例:** プロキシサーバーに適切な認証情報を提供する．

### 408 Request Timeout
- **説明:** リクエストがタイムアウトした．
- **対処例:** ネットワーク接続を確認し，リクエストを再試行する．

### 409 Conflict
- **説明:** リクエストが現在のリソースの状態と競合している．
- **対処例:** リソースの現在の状態を確認し，競合を解決してからリクエストを再試行する．

### 410 Gone
- **説明:** リソースが永久に利用不可能になった．
- **対処例:** リソースへの参照を削除し，代替リソースがあればそれを使用する．

### 411 Length Required
- **説明:** Content-Lengthヘッダーが必要である．
- **対処例:** リクエストにContent-Lengthヘッダーを追加する．

### 412 Precondition Failed
- **説明:** 前提条件が満たされていない．
- **対処例:** リクエストの前提条件を確認し，必要に応じて修正する．

### 413 Payload Too Large
- **説明:** リクエストエンティティが大きすぎる．
- **対処例:** リクエストのペイロードサイズを削減する．

### 414 URI Too Long
- **説明:** リクエストURIが長すぎる．
- **対処例:** URIを短縮するか，POSTメソッドを使用してデータを送信する．

### 415 Unsupported Media Type
- **説明:** サポートされていないメディアタイプである．
- **対処例:** サーバーがサポートするメディアタイプを使用する．

### 416 Range Not Satisfiable
- **説明:** リクエストされた範囲が満たせない．
- **対処例:** 有効な範囲を指定してリクエストを再試行する．

### 417 Expectation Failed
- **説明:** Expectヘッダーの要求を満たせない．
- **対処例:** Expectヘッダーを削除するか，サーバーの能力に合わせて修正する．

### 418 I'm a teapot
- **説明:** エイプリルフールのジョーク
- **対処例:** 通常は対処不要．ユーモアを楽しむ

https://qiita.com/tarakokko3233/items/7a76afe561e48f5a0239

### 421 Misdirected Request
- **説明:** サーバーがリクエストを処理できない．
- **対処例:** 正しいサーバーにリクエストを送信する．

### 422 Unprocessable Entity
- **説明:** リクエストは理解できるが，処理できない．
- **対処例:** リクエストのセマンティクスを確認し，修正する．

### 423 Locked
- **説明:** リソースがロックされている．
- **対処例:** リソースのロックが解除されるのを待つか，ロック解除をリクエストする．

### 424 Failed Dependency
- **説明:** 前のリクエストの失敗により，このリクエストも失敗した．
- **対処例:** 依存関係にあるリクエストを修正し，再試行する．

### 425 Too Early
- **説明:** リプレイ攻撃を防ぐためにリクエストを拒否した．
- **対処例:** 適切なタイミングでリクエストを再試行する．

### 426 Upgrade Required
- **説明:** クライアントはプロトコルをアップグレードする必要がある．
- **対処例:** 指定されたプロトコルにアップグレードしてリクエストを再試行する．

### 428 Precondition Required
- **説明:** 前提条件が必要である．
- **対処例:** 必要な前提条件を追加してリクエストを再試行する．

### 429 Too Many Requests
- **説明:** クライアントが短時間に多すぎるリクエストを送信した．
- **対処例:** レートリミットを遵守し，適切な間隔を空けてリクエストを送信する．

### 431 Request Header Fields Too Large
- **説明:** ヘッダーフィールドが大きすぎる．
- **対処例:** ヘッダーフィールドのサイズを削減する．

### 451 Unavailable For Legal Reasons
- **説明:** 法的理由により利用できない．
- **対処例:** 法的制限を確認し，必要に応じて適切な権限を取得する．

## 5xx サーバーエラー

### 500 Internal Server Error
- **説明:** サーバー内部でエラーが発生した．
- **対処例:** サーバー管理者に連絡し，エラーログを確認して問題を修正する．

### 501 Not Implemented
- **説明:** サーバーがリクエストを実行する機能を持っていない．
- **対処例:** サーバーの機能を拡張するか，サポートされている機能のみを使用する．

### 502 Bad Gateway
- **説明:** ゲートウェイサーバーが無効な応答を受け取った．
- **対処例:** バックエンドサーバーの状態を確認し，必要に応じて修正する．

### 503 Service Unavailable
- **説明:** サーバーが一時的に利用できない．
- **対処例:** サーバーの負荷を軽減し，後でリクエストを再試行する．

### 504 Gateway Timeout
- **説明:** ゲートウェイがタイムアウトした．
- **対処例:** バックエンドサーバーの応答時間を改善し，必要に応じてタイムアウト設定を調整する．

### 505 HTTP Version Not Supported
- **説明:** サポートされていないHTTPバージョンである．
- **対処例:** サポートされているHTTPバージョンを使用する．

### 506 Variant Also Negotiates
- **説明:** 内部構成エラーがある．
- **対処例:** サーバーの設定を見直し，コンテンツネゴシエーションの循環を解消する．

### 507 Insufficient Storage
- **説明:** サーバーに十分な空き容量がない．
- **対処例:** サーバーのストレージ容量を増やすか，不要なデータを削除する．

### 508 Loop Detected
- **説明:** 無限ループを検出した．
- **対処例:** サーバーの設定や処理ロジックを見直し，ループを解消する．

### 510 Not Extended
- **説明:** サーバーへの拡張が必要である．
- **対処例:** 必要な拡張をサーバーに実装する．

### 511 Network Authentication Required
- **説明:** ネットワークアクセスに認証が必要である．
- **対処例:** ネットワークの認証ページにアクセスし，必要な認証を行う．