HTTPステータスコードリファレンス
HTTPステータスコードを説明付きで閲覧します。
| Code | Name | Class | Meaning |
|---|---|---|---|
| 100 | Continue | Informational | The client should continue with its request. |
| 101 | Switching Protocols | Informational | The server is switching protocols as requested. |
| 200 | OK | Success | The request succeeded. |
| 201 | Created | Success | The request succeeded and a new resource was created. |
| 202 | Accepted | Success | The request was accepted but not yet processed. |
| 204 | No Content | Success | Success, but there is no content to return. |
| 206 | Partial Content | Success | The server delivered part of the resource (range request). |
| 301 | Moved Permanently | Redirection | The resource has permanently moved to a new URL. |
| 302 | Found | Redirection | The resource is temporarily at a different URL. |
| 304 | Not Modified | Redirection | The cached version is still valid. |
| 307 | Temporary Redirect | Redirection | Temporary redirect that preserves the method. |
| 308 | Permanent Redirect | Redirection | Permanent redirect that preserves the method. |
| 400 | Bad Request | Client Error | The server could not understand the request. |
| 401 | Unauthorized | Client Error | Authentication is required and has failed or not been provided. |
| 403 | Forbidden | Client Error | The server understood but refuses to authorize the request. |
| 404 | Not Found | Client Error | The requested resource could not be found. |
| 405 | Method Not Allowed | Client Error | The HTTP method is not supported for this resource. |
| 408 | Request Timeout | Client Error | The server timed out waiting for the request. |
| 409 | Conflict | Client Error | The request conflicts with the current state of the resource. |
| 410 | Gone | Client Error | The resource is permanently gone. |
| 418 | I'm a teapot | Client Error | An April Fools joke from RFC 2324. |
| 422 | Unprocessable Entity | Client Error | The request was well-formed but semantically invalid. |
| 429 | Too Many Requests | Client Error | The client has sent too many requests (rate limited). |
| 500 | Internal Server Error | Server Error | A generic server-side error occurred. |
| 501 | Not Implemented | Server Error | The server does not support the requested functionality. |
| 502 | Bad Gateway | Server Error | An upstream server returned an invalid response. |
| 503 | Service Unavailable | Server Error | The server is temporarily overloaded or down. |
| 504 | Gateway Timeout | Server Error | An upstream server did not respond in time. |
概要
ステータスコードはサーバーによる「何が起きたか」の一語の要約で、誤ったものを 選ぶと、整理の良し悪しをはるかに超えた結果を招きます。クライアントが再試行するか、 キャッシュが保存するか、クローラーがその URL を保持し続けるか、プロキシが リクエストを再処理するかが変わるのです。
これは実際に出会うコードを検索できる参照表で、仕様の言い換えではなく実務上の 使い分けを添えています。
使い方
番号(404)または名称の一部(gateway)を入力すると一覧が絞り込まれます。
両方のフィールドで照合するので、too many と 429 は同じ項目に行き着きます。
5 つのクラス
| クラス | 意味 | クライアントがすべきこと |
|---|---|---|
1xx | 情報 — リクエストは進行中 | 待ち続ける |
2xx | 成功 | レスポンスを使う |
3xx | リダイレクト — 別の場所にある、または変更なし | 辿る、またはキャッシュを使う |
4xx | クライアントエラー — リクエスト自体が問題 | そのままでは再試行しない |
5xx | サーバーエラー — リクエストは正しかったかもしれない | バックオフして再試行 |
実務で最も重要なのは 4xx と 5xx の切り分けです。再試行の挙動を決めるからです。
不正な形式のリクエストに 500 を返すサーバーは、リトライ方針を持つ全ての
まともなクライアントから、その不正なリクエストを何度も何度も送られます。
400 を返せばループが止まります。
押さえておく価値のある使い分け
本文にエラーを入れた 200 — API でよく見かけ、ほぼ常に誤りです。自分と
クライアントの間にあるすべての層(キャッシュ・プロキシ・監視・リトライ処理)は
JSON ではなくステータスコードを読みます。200 を返すエラーは、それらすべてから
見えません。
作成時の 201 と 200 — 201 には新しいリソースを指す Location ヘッダを
添えるべきです。クライアントが使うのはその部分で、コード単独では大した情報を
足しません。
202 Accepted — 実行したのではなくキューに入れた作業に対する正しい答えです。
これは約束なので、クライアントがどこを確認すればよいか(状態 URL かジョブ ID)を
伝える必要があります。
204 No Content — 意図的に本文が空の成功で、典型的には DELETE か何も返さない
PUT に使います。空の JSON オブジェクトではなく、本文が一切無い必要があります。
304 Not Modified — ETag か Last-Modified が一致する条件付きリクエストへの
応答です。本文を持たないことがまさに要点で、クライアントは既にそのバイト列を
持っています。304 を返さない実装は、再検証のたびにリソース全体を再転送します。
400 と 422 — 400 はサーバーが解析できなかったリクエスト(不正な JSON、
必須パラメータの欠落)に。422 は解析は通ってバリデーションで落ちたリクエストに。
この区別は、クライアントに直すべきものが直列化なのかデータなのかを伝えます。
405 Method Not Allowed — 受け付けるメソッドを列挙した Allow ヘッダを
含めなければなりません。無ければ、クライアントは進む方法を示されずに拒否された
だけになります。
409 Conflict — 現在の状態に適用できないリクエストに使います。古いバージョンに
対する編集、一意性制約に違反する重複などです。汎用の「何かがおかしい」ではありません。
410 Gone — より強い 404 で、「これは存在したが戻ってこない」という意味です。
クローラーは 410 を 404 より速く落とすので、意図して削除したコンテンツには
そちらが望ましい挙動です。
429 Too Many Requests — Retry-After が必要です。無ければクライアントは
推測し、しかも下手に推測します。通常は即座に再試行します。
502 と 503 と 504 — 502 は上流が不正なレスポンスを返したという意味。
503 はこのサーバーが利用不能で、典型的には過負荷か保守中。504 は上流が
時間内に応答しなかったという意味です。3 つは別の場所を指しており、互換的に
使うと障害箇所の特定が難しくなります。
使用例
- クローラーが削除済みページを要求し続ける —
404ではなく410を返します。 - クライアントが失敗するエンドポイントを叩き続ける — 実際には
4xxの状況に 対して5xxを返していないか確認します。 - リダイレクトの裏でフォーム送信のデータが失われる — そのリダイレクトは
おそらく
301か302です。308か307に変えます。 - CDN がレスポンスをキャッシュしない —
2xxと3xxは既定でキャッシュ可能、 ほとんどの4xxは不可、5xxは決してキャッシュすべきではありません。 - API が
200を返してクライアントが失敗を無視する — 無視しているのではなく、 何も伝えられていないのです。
注意事項
418 I'm a teapot は、登録済みで恒久的に予約されているという意味では実在します。
エイプリルフールの RFC が出典で、調べる人がいるので一覧に入っています。
レジストリ外のコードも仕様上は正当です。クライアントは未知のコードをクラスで
扱わなければならないので、独自の 299 は成功として、独自の 599 はサーバー
エラーとして処理されます。ただし混乱に見合う価値があることはまずありません。
ここに載せているのは実際に使われているコードです。完全なレジストリは IANA が 管理しており、WebDAV などの拡張向けで通常の Web サービスが返さないコードも 含まれます。
稼働中の URL が実際にどのコードを返すか、リダイレクト連鎖も含めて確認するには HTTP ヘッダチェッカー を使ってください。