HTTPレスポンスのステータスコードについて【Web開発入門】

Programming

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

サーバへアクセスが一時的に停止していることを表します。

その他のステータスコードについては、下記のステータスコード一覧をご参照ください。

HTTP レスポンスステータスコード - HTTP | MDN
HTTP のレスポンスステータスコードは、特定の HTTP リクエストが正常に完了したどうかを示します。 レスポンスは 5 つのクラスに分類されています。

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

Web API: The Good Parts

– 参考サイト –

PHP: http_response_code - Manual
PHP is a popular general-purpose scripting language that powers everything from your blog to the most popular websites in the world.
PHP: header - Manual
PHP is a popular general-purpose scripting language that powers everything from your blog to the most popular websites in the world.
HTTP Responses — CodeIgniter 4.5.5 documentation
Laravel - The PHP Framework For Web Artisans
Laravel is a PHP web application framework with expressive, elegant syntax. We’ve already laid the foundation — freeing you to create without sweating the small...

– 画像出典元 –

Data illustrations by Storyset

タイトルとURLをコピーしました