読者です 読者をやめる 読者になる 読者になる

Webを支える技術を研修で読んでる まとめ4

この記事について

技術研修で読み進めているWebを支える技術について、各章のまとめを順次上げていく。

ステータスコードとは

概要

WebサービスでもWebAPIでもリクエストに対するレスポンスの内容を概略的に表したものがステータスコードである。 これらを正しく使うことは、WebAPIを作成する上でのマナーである。 例えば、エラーを表すコードを返さなければならないのに、成功のコードを返してしまったら、受け取った側はそれを正しいものとして認識してしまう。 つまり、ステータスコードが正しく守られていない場合は、専用のクライアントを実装しなければならず、色々なクライアントで使用出来るというWebAPIの利点を活かすことも出来ない。 そのため、誤用することなく、正しい理解をすることが求められる。

Webを支える技術を研修で読んでる まとめ3 - pokotyamu的書きなぐり日記で述べた、レスポンスメッセージの1行目にあるのが、ステータスラインである。 おさらいすると、ステータスラインは、プロトコルバージョン、ステータスコード、テキストフレーズから成る。 例えば HTTP/1.1 200 OKといった形のステータスラインがあった場合。 200ステータスコードである。

ステータスコードは3桁の数字であり、先頭の数字によって5つに分類することが出来る。

ステータスコード 意味
1xx 処理中
2xx 成功
3xx リダイレクト
4xx クライアントエラー
5xx サーバエラー

この5つに分けられている理由としては、次の3つが挙げられる。

  • どのようなレスポンスであったかの概要を理解することができる
  • クライアントとサーバの結びつきを緩やかにすることができ、サーバのバージョンアップやクライアントの置き換えが行いやすくなる
  • ステータスコードが新たに追加された場合でも、先頭の数字さえ分かればクライアント側で最低限の処理を行うことができる


以降では、5つの分類それぞれの概要と代表的なものについて説明する。 基本的にRFC2616の原文リンクの和訳と補足の形ですすめる。

1xx

概要

1xx系は、処理が継続していることを示す。 クライアントはそのままリクエストを継続するか、サーバの支持にしたがってプロトコルをアップデートして再送信する。 実際に見かける場は、ほとんどないため、今回は割愛する。

2xx

概要

何かのリクエストが成功したことを示す。

200 OK

リクエストが問題なく受理されて、要求に従ったレスポンスが返る。 ブラウザでページが読み込まれて、表示された時に使用されることから、一番遭遇頻度が高いステータスコードといえる。

201 Created

リクエストが完了し、新たに作成されたデータのURIが返る。 新たに作成されたURIの情報はレスポンスヘッダのLocationで示される。 ※ただし、PUTで作成した場合は、Locationは返らない さらにレスポンスで返されるリソースのタイプはContent-Typeで示される。

この生成処理は、リクエストを返す前には終了していなければならず、もし直ぐに返せない場合は、202 Acceptedを返す。

3xx

概要

他のリソースへのリダイレクトを示す。 クライアントはこのステータスコードを受け取った時、レスポンスメッセージのLocationヘッダを見て新しいリソースへ接続する。

301 Moved Permanently

リクエストで指定したリソースが新しいURIに移動したことを示す。 その時のロケーションはレスポンスヘッダ内のLocationで示される。 もし、301のステータスコードGET,HEADメソッド以外で受け取ったユーザエージェントは、条件の変更などが発生する場合があるため、ユーザが確認出来るまで、自動的にリダイレクトの要求を受け取るべきではない。

302 Found

リクエストで指定されたURLが一時的に存在せず、別のURLに仮の移転をしているので、移動先のURLに転送したことを示す。

302のステータスコードも301と同様にGET,HEADメソッド以外で受け取ったユーザエージェントは、条件の変更などが発生する場合があるため、ユーザが確認出来るまで、自動的にリダイレクトの要求を受け取るべきではない。

303 See Other

主にPOST後のリダイレクトで用いられる。 フォームからPOSTした後にリダイレクトしてTOPページに戻す場合が考えられる。 最初の処理では、POSTでリクエストしたが、ブラウザはリダイレクト先にはGETを使う。

307 Temporary Redirect

HTTP1.1で追加され、本来の302が持つべきだった内容を再定義している。よって今後の設計においては、302ではなく307を使うことが推奨される。
最初のURLでは実際の処理は行わず、リダイレクト先に改めてリクエストを出し直して欲しい時に使う。 つまり、最初のリクエストがPOSTだった場合、ブラウザはリダイレクト先にもPOSTを使う。 基本的な処理自体は302と変わらないが、元々リクエストに使った動詞をそのまま使って、変更先のURIにリクエストして欲しい場合は307を使うべきである。

参考:HTTPステータスコード – 302 Foundと303 See Otherと307 Temporary Redirectの違いについて

301と307(302)の違い

どちらも、URIの移動を示すステータスコードである。 ユーザ目線からしても、どちらもページが移動する挙動のため意識する必要はない。 しかし、 検索エンジンからすると以下のように挙動が変わる。

  • 301の場合は、URLが移転先のものになる
    • サイトのリニューアルでURLが変更になった場合
  • 307(302)の場合は、URLが元のURLのものになる
    • サーバーエラーが発生したときにエラーページへリダイレクトする場合

サイトのURIを変更する時は、これらの違いを意識する設計が求められる。 参考:301リダイレクトと302リダイレクトは離婚と不倫 – SEO例え話

4xx

概要

クライアントエラーを示す。 原因はクライアント側のリクエストにある。 エラーを解消しない限り正常な結果が得られないので、同じリクエストをそのまま再送信することは出来ない。

400 Bad Request

リクエストの文章が間違っている時に発生する。 クライアントは、再度修正して送り返す必要がある。

401 Unauthorized

適切な認証情報を与えずにリクエストを行った時に発生する。 レスポンスのWWW-Authenticateヘッダで、クライアントに対して認証方式を伝える。

403 Forbidden

リクエスト自体の処理は受け付けたが、権限がないために実行出来ない時発生する。 ファイルの閲覧や、外部サイトからのアクセスを禁止しているページで発生する。 解消するためには、サーバ側の設定を調整するしかない。

404 Not Found

指定したリソースが存在しない場合に発生する。 既に削除されてしまっていた場合や、URLの入力ミスなどの時に起こる。

403などで外部サイトからのアクセスを禁止している時に、要求が拒否された理由を正確に明らかにしたくない場合や、他の応答が適用されない場合、404が使用されます。

5xx

概要

サーバエラーを示す。 原因はサーバ側にある。 サーバ側の原因が解決すれば、同一のリクエストを再送信して正常な結果が得られる可能性がある。

500 Internal Server Error

サーバ側に何らかの異常が生じていて、正しいレスポンスが返せない時に発生する。 レスポンスボディには、異常の原因が入る。

503 Service Unavailable

サーバがメンテナンスや高負荷に耐え切れずサービスを提供していない時に発生する。 ツイッターのクジラが出たなどが有名どころ。 f:id:pokotyamu:20160510190718j:plain

エラー処理

4xx系と5xx系は、どちらもエラーを表現している。 エラーコードはHTTP仕様が規定しているが、ボディーにどんなメッセージを入れるかは規定していないので、そのページが人間用なのかプログラム用なのかで分けてエラーメッセージを返すとよい。

まとめ

今回のステータスコードを一覧にまとめる。

ステータスコード 補足文章 概略
200 OK リクエストが問題なく受理されて、
要求に合わせたレスポンスが返る
201 Created データの作成が行われ、新たに作成されたデータのURIが返る
301 Moved Permanently リクエストで指定したリソースが
新しいURIに移動したことを示す
302 Found リクエストで指定されたURLが一時的に存在せず、
別のURLに仮の移転をしているので、
移動先のURLに転送したことを示す
303 See Othoer 主にPOST後のリダイレクトで用いられる
307 Temporary Redirect 基本302と同じ。
元々リクエストに使った動詞をそのまま使って、
変更先のURIにリクエストして欲しい場合に使用
400 Bad Request リクエストの文章が間違っている時に発生する
401 Unauthorized 適切な認証情報を与えずにリクエストを行った時に発生する
403 Forbidden リクエスト自体の処理は受け付けたが、
権限がないために実行出来ない時発生する
404 Not Found 指定したリソースが存在しない場合に発生する
500 Internal Server Error サーバ側に何らかの異常が生じていて、
正しいレスポンスが返せない時に発生する
503 Service Unavailable サーバがメンテナンス中や高負荷に耐え切れず
サービスを提供していない時に発生する