
初心者のためのHTTPステータスコードの解説
HTTPステータスコードとは?
- 厳密に言うと、HTTPレスポンスのステータスコードは
- サーバーからの応答の意味を示す3桁の数値コード
- 特定のHTTPリクエストが正常に完了したかどうかを示す
HTTPレスポンス
レスポンスメッセージは、主に以下の3種類の情報に分けられます。
-ステータスライン
-HTTP レスポンスヘッダ
-HTTP レスポンスボディ
ステータスコードはヘッダの1行目にある
ステータスコードは、ヘッダーの最初の行にあるステータスラインに
http/1.1 200 ok
Date: Sat, 22 Feb 2020 08:09:30 GMT
コンテンツタイプ: アプリケーション/json; charset=utf-8
接続: keep-alive
サーバー: nginx
ETag: "e287c729017cc9785487098b6b103af6"
Cache-Control: max-age=0, private, must-revalidate
X-UA-Compatible: IE=Edge,chrome=1
X-Runtime: 0.003487
ステータスラインには、ここで説明するステータスコードの他に、プロトコルとテキストフレーズが含まれています。
HTTP/1.1 200 OK
- プロトコルは HTTP/1.1
- ステータスコード 200
- テキストのフレーズ OK
ヘッダーはさらに細分化されていますが、この場合は違います。
ステータスコードは以下の5つのクラスに分かれています。
100s = 情報応答
200s = 成功応答
300s = リダイレクト
400s = クライアントエラー
500s = サーバーエラー
以下に、代表的なステータスコードの概要を抜粋します。
番号 100 情報応答
- 処理が継続していることを示す。
- クライアントは、リクエストを続行するか、サーバーの指示に従ってプロトコルを更新して再送することができます。
- HTTP/1.0の規約では1xx番号の定義がないため、100番台はあまり使われません。
100 続行
サーバーはリクエストを拒否していません。クライアントはリクエストを続行できます。
101 プロトコルの切り替え
サーバーがプロトコルの切り替えを要求しています。
200 単位 成功した応答
- 成功時に返される最も一般的なステータスコード
- 要求された操作は成功し、指定されたデータの取得に成功しました。
- GET: ボディにリソースが格納されています。
- PUT、POST。ボディに操作結果が格納されている
201 作成
- POST, PUTです。リクエストが成功し、リソースが作成されました。
- POST の場合、URI はレスポンスの Location ヘッダーに含まれます。
- ユーザーの新規登録、画像のアップロード、DBテーブルの追加など。
- ボディには新しく作成されたリソースが含まれていることが多いですが、特に何も含まれていなくても構いません。
202 Accepted
- リクエストは受理されましたが、まだ処理されていません。
- ファイル形式の変換、プッシュ通知リクエスト、バッチ処理など、サーバー側で非同期の処理が行われる場合に返されます。
204 コンテンツなし
- レスポンスボディが空の場合に返されます。
- DELETE でデータを削除したときに返されます。
- POST でフォームの内容を送信したが、画面が更新されていない場合に表示されます。
- PUTやPATCHでデータが正しく更新された場合
- DELETE以外には使うべきではないという意見もあります。
205 コンテンツのリセット
- ユーザーエージェントの画面がリセットされたときに返されます。
- 204 と同様、応答ボディはありません。
300 複数の選択肢のリダイレクト
300 複数の選択肢
- リクエストに対して複数の回答があることを示します。
- ユーザーエージェントやユーザーには、選択肢へのリンクとなるHTMLが表示され、ユーザーはその中から1つを選択します。
301 Moved Permanently
- リクエストされたリソースの URL が恒久的に変更されたことを示します。
- ウェブサイトの移動や、HTTP から HTTPS へのリダイレクトなどです。
- Location ヘッダーは移動先の URL を示します。
302 Found
- リクエストされたリソースのURLが一時的に変更されました。
- 送信先のURLは、Locationヘッダーに表示されます。
- 実際には、307として再定義され、現在は非推奨となっている303に使用されることが多いようです。
303 See Other
- 要求されたリソースが別の URI で取得可能であることを示します。
- Location ヘッダーは、移動先の URL を示します。
- ブラウザのフォームからのPOSTに応答して結果ページにリダイレクトする際に使用します。
307 一時的なリダイレクト
- 一時的なリダイレクト
- 誤用が横行したため、302 を再定義したものです。
- Location ヘッダーは、ユーザーがリダイレクトされる URL を示します。
- ユーザーエージェントは、使用する HTTP メソッドを変更しないでください。
308 パーマネントリダイレクト
- パーマネントリダイレクト
- 301 の規格外の使い方が横行しているため再定義しました。
- Location ヘッダーは、移動先の URL を示します。
- ユーザーエージェントは、使用する HTTP メソッドを変更してはいけません。
400 クライアントエラー
400 Bad Request
- 不正なリクエスト
- 定義されていないメソッドを使用したり、不正なパラメーターを使用したりするなど、不正なクライアントリクエストです。
- また、適切なクライアントエラーを示すステータスコードが他にない場合にも使用します。
401 認証されていません
- 認証エラー
- ログインが必要なページで、ID やパスワードが間違っています。
- リクエストに必要な Authorization ヘッダーが含まれていません。
- トークンの有効期限が切れている、破損しているなどの理由で無効になっています。
403 Forbidden
- 認証エラー
- クライアントにアクセスする権限がないなどの理由で、サーバーからの応答が拒否されています。
- サーバーが特定のIPアドレスからしかアクセスできない場合に使用します。
- 401 とは異なり、クライアントは識別されます。
404 Not Found
- 要求されたリソースが存在しません。
- Web 上で最もよく見られるエラーステータスコードの 1 つです。
- URI 自体が存在しないのか、または取得するリソースが存在しないのかを判断するためには、より多くの情報が必要です。
- 権限のないクライアントからリソースの存在を隠すために、403ではなく404を返すこともあります。
405 メソッドが許可されていません
- エンドポイントは存在するが、HTTP メソッドが許可されていません。
- GET でアクセス可能な検索 API で POST を使おうとした場合。
- APIがリソースのDELETEを禁止している場合。
408 リクエストタイムアウト
- 指定された時間内にリクエストが完了しませんでした。
- ChromeやFirefoxなど、ブラウジングを高速化するためにHTTPの事前接続機能を使用するブラウザでよく使われます。
- 回線の接続速度が遅い場合に発生します。
409 コンフリクト
- リソースの競合が発生した場合に発生します。
- 既に存在するメールアドレスや同じIDのユーザーを登録しようとした場合。
- 空でないディレクトリを削除しようとしたり、既に使用されているリソースに名前を変更しようとした場合。
410 Gone
- リクエストされたコンテンツがサーバーから永久に削除されており、転送先がない場合。
- 404 とは異なり、コンテンツがかつて存在していたが、現在は存在しないことを意味します。
- 期間限定のプロモーションでの使用を意図しています。
- ユーザー情報を扱い、410を返すAPIは、個人情報保護の観点から問題視されることがあります(ユーザーが削除した情報が保持されている≒ユーザーが完全に削除したわけではないということ)。
413 ペイロードが大きすぎる
- リクエストヘッダまたはボディが、サーバが設定した制限値を超えたことを示します。
- サーバーは接続を閉じるか、エラーメッセージをサーバーに送信します(例:ファイルのアップロードが許容サイズを超えた場合)。
- サーバーは接続を閉じるか、Retry-Afterヘッダーを返します。
414 URI Too Long
- クライアントが要求した URI がサーバーの処理能力を超えています。
- サーバーは接続を閉じるか、Retry-Afterヘッダーを返します。
415 サポートされていないメディアタイプ
- 要求されたデータのメディアタイプ(Content-Type)をサーバーがサポートしていないため、サーバーは要求を拒否しました。
- JSON リクエストしか受け付けない API に XML を送信したか、サポートされていない画像形式の画像をアップロードしようとしました。
429 リクエスト数が多すぎます
- アクセス数が許容値を超えた場合に返されます。
- 2012年にRFC6585で定義された新しいステータスコードです。
- 一定時間内にレート制限を超える大量のリクエストが送信されています(例:1分間に60リクエストのAPIリクエスト制限など)。
500 サーバーエラー
500 Internal Server Error
- サーバー側で何らかのエラーが発生し、応答が正常ではありません。
-「Something went wrong」というエラーメッセージが返されることが多く、クライアントでは解決できません。
-他に適切なエラーコードがない場合にも使用されます。
-サーバーのエラーログを見ることで原因がわかる場合もあります。
502 Bad Gateway
-ゲートウェイまたはプロキシに問題があります。
-ゲートウェイとして動作しているサーバーが無効な応答を受信しました。
503 Service Unavailable
-サーバーがリクエストを処理する準備ができていません。
-一時的なトラフィックの集中やメンテナンスなどにより、サーバーがダウンしています。
-メンテナンスの場合は、Retry-After ヘッダーに再起動予定時間(秒)を含めることができます。
504 ゲートウェイタイムアウト
-ゲートウェイとして動作しているサーバーが、指定された時間内に応答を受信しなかったことを示します。
-サイトの移行などによる一時的なDNSの異常の可能性があります。
505 HTTP バージョン未対応
-サーバーは要求された HTTP プロトコルのバージョンをサポートしていません。
-現在のプロトコルは HTTP/2 です。
-HTTP/2 Overview|Web Fundamentals|Google Developers
参考