1.はじめに
こんにちは、かじです。今回はステータスコードについて解説していきたいと思います。
バックエンドの言語を学習してある程度Webアプリケーションを作れるようになったという人は、ステータスコードを理解することでWebサービスやWeb APIを開発する際に、エラー処理においてどのような処理をすべきかを考慮することができるようになります。
是非、ステータスコードを学習して、より適切なプログラム設計ができる力を身につけていきましょう。
2.HTTPレスポンスの1行目には何があるのか
Webの仕組みでは、HTTPリクエストをクライアントから受信したサーバーはアプリケーションの処理を終えたあと、HTTPレスポンスをクライアントへ返します。
今回取り扱うのは、このHTTPレスポンスの1行目です。そこには何があるのでしょうか。
HTTPレスポンスの1行目には、プロトコルバージョンおよびステータスコード、テキストフレーズから成るステータスラインがあります。このステータスラインに含まれるステータスコードおよびテキストフレーズを見ることで、クライアントからのリクエストの処理状態を確認することができます。
今回の記事はステータスコードですが、他のステータスラインを構成する要素を簡単にも触れたいと思います。
まずは、プロトコルバージョンにはHTTP/1.1やHTTP/2.0といったどのプロトコルバージョンで通信したのかが記載されています。
次にテキストフレーズです。テキストフレーズは、200の場合はOK、400の場合はBad Requestというようにステータスコードに対応した説明句が入ります。
3.ステータスコードとは
ステータスコードは、クライアントから受けたリクエストを無事に処理できたか否かを3桁の番号で示しています。3桁の番号と言っても、000〜999まで順番に存在しているという訳ではなく、頭一桁で大体の意味がわかるようになっています。その分類は下記のとおりです。
1xx:サーバーが処理中
2xx:リクエストの成功
3xx:リダイレクト
4xx:クライアント側でのエラー
5xx:サーバ側でのエラー
4.使用頻度の高いステータスコード
次によく使用されるステータスコードです。ステータスコードの隣にはテキストフレーズを記載しています。
2xx
200 OK
リクエストが成功したことを表します。
201 Created
リソースの作成が成功したことを表します。
レスポンスボディに作成したリソースを入れることが多いです。
202 Accepted
リクエストの処理は受け付けたが、処理が非同期で行われるなどの理由から完了していないことを表します。
例:モバイルのプッシュ通知などを行う場合
204 No Content
リソースの削除を行うなどコンテンツがないことを表します。
3xx
301 Moved Permanently
リクエストで指定したURIのリソースが別のURIに移動したことを表します。 古いURIを保ちつつ、新しいURIに移行する際に使用します。
302 Found
リクエストされたリソースが一時的に別のURIでへ移動したことを表します。
303 See Other
リクエストに対する処理結果が別のURIで取得できることを表します。
*301と302にはそれぞれ307 Temporary Redirectや308 Permanent Redirectといった似たステータスコードがあります。それぞれの違いは、301と302はメソッドの変更を許容しているのに対して、307と308はメソッドの変更を許可していないことにあります。
304 Not Modified
前回の取得データから更新されていないことを表します。
4xx
400 Bad Request
リクエストの構文やパラメータが間違っていることを表します。また、他にクライアントエラーを表すことのできない際のエラーやクライアントにとって未知の400系のエラーを受け取った際もこの400を使用します。
401 Unauthorized
適切な認証情報をリクエストに与えられなかったことを表しており、WWW-Authenticateヘッダで認証方法を示します。
403Forbidden
認可(特定のユーザーに対してある操作の権限を許可があるか否か)のエラーを表します。
404 Not Found
指定したリソースが見つからないことを表します。
405 Method Not Allowed
URIは存在しているが、許可されていないメソッドが使用されていることを表します。
406 Not Acceptable
クライアントが指定してきたデータ形式が対応していないことを表します。
408 Request Timeout
リクエストをクライアントがサーバに送るのに時間がかかりすぎてサーバ側でタイムアウトを起こしたことを表します。
409 Conflict
重複したIDを登録しようとするなどのリソース競合が発生したことを表します。
410 Gone
指定したページがかつて存在したが、今はもう存在しないことを表します。
413 Request Entity Too Large
リクエストボディが大きすぎることを表します。
414 Request-URI Too Long
URIのクエリパラメータが長すぎることを表します。
415 Unsupported Media Type
リクエストヘッダのContent-Typeで指定されているデータ形式がサーバに対応していないことを表します。
429 Too Many Requests
アクセス回数が許容限度を超えたことを表します。
5xx
500 Internal Server Error
サーバー側になんらかのエラーが生じて正しいエラーを返せないことを表します。レスポンスボディにエラーの理由が入ります。
また、他に適切なサーバーエラーが見つからない場合、クライアントにとって未知の500系のエラーが出た場合も500を出して表します。
503 Service Unavailable
サーバへアクセスが一時的に停止していることを表します。
その他のステータスコードについては、下記のステータスコード一覧をご参照ください。
5.エラーメッセージについて
400系と500系のボディにエラーメッセージを入れることが一般的です。WebサイトやWebサービスなど対ユーザーであればHTML、Web APIといった対プログラムであれば、クライアントのプログラムが理解できるエラーメッセージを返すことが大切です。
ステータスコードの誤用についても注意が必要です。HTTPは汎用的に処理できるように設計されていて、クライアントライブラリはステータスコードを見て動作を決めます。そのため、リクエストが成功したからといって、実装した処理内で発生したエラーを200で返す場合、クライアントをそれ用に作る必要が生じてしまいます。よってエラーをプログラムによって実装する場合は、適切なステータスコードを返すようにして、クライアントのリクエストが成功した場合のみ200系を返すましょう。
また、Web APIでエラーを返す場合、エラーが出た際にどのエラーなのか詳細なエラーメッセージをレスポンスヘッダやレスポンスボディで返すことができるように実装する必要があります。
最後にしっくりくるコードがない場合は200や400、500といった00で終わるようにする
6.ステータスコードを設定する方法
Apacheの場合
配信するファイルの条件によって自動でステータスコードが決定します。また、mod_rewriteモジュールを使えば任意のステータスコードを返すことが可能です。
PHPの場合
http_response_code()メソッドでステータスコードを取得、設定することが可能です。
またheader()メソッドを使用することでステータスコードを含めて、ステータスコードを含めてHTTPヘッダの設定を行うことができます。
CodeIgniter4の場合
setStatusCode()メソッドでステータスコードをセットすることが可能です。
また、レスポンスボディを手動で変更してエラーメッセージを出したい場合はsetBody()メソッドを使用することで実装可能です。
Laravel10の場合
view()メソッドに第3引数にステータスコードを渡す、もしくは、response()メソッドの第一引数にテキストフレーズ、第二引数にステータスコードを渡すことで実装可能です。
本日はここまでとなります。最後まで閲覧くださりありがとうございました。
– 参考書籍 –
Webを支える技術 ―― HTTP,URI,HTML,そしてREST
– 参考サイト –
– 画像出典元 –