http のメソッドとステータスコード
http はクライアントからメソッドで要求 (リクエスト) を投げ、サーバ側でリクエスト内容と状況に応じたステータスコードを応答 (レスポンス) します。
メソッド
よく使われるメソッドは GET と POST です。
GET はサーバ上のファイルなどのデータをダウンロードを要求するメソッドです。html ファイルだけでなく txt でも pdf でも取得可能です。一般的にはブラウザ上に表示されますが、ブラウザの設定によっては pdf 等は Adobe Reader 等が起動することもあります。
POST はデータをアップロードするためのメソッドです。主に掲示板への投稿などを行うことができます。送り込むデータはリクエストヘッダ内に含めても良いし、メッセージボディ内に含めても構いません。
ステータスコード
また、よく使われるステータスコードは 200 です。これは処理が正常に完了したことを示します。
GET に対してのレスポンスのステータスコードが『200』であれば、メッセージの中に GET で要求したファイルがペイロードに含まれています。
POST に対してのレスポンスのヘッダーにスタータスコード『200』があれば、POST で送られたデータが無事サーバ側で受け取れたことを示しています。メッセージの中には完了後の表示画面用のファイルが含まれます。サーバはデータを受け取って処理を行いますが、その結果が表示されるかどうかは、POSTでデータを送ったスクリプトファイル次第です。
http のフォーマット
http のフォーマットは「スタートライン」と「ヘッダフィールド」と「メッセージボディ」の3つから構成されます。リクエスト(クライアント⇒Webサーバ)の場合、「スタートライン」は特に「リクエストライン」と呼ばれ、ここにはメソッドが書かれます。同様にレスポンスのスタートラインは「ステータスライン」と呼ばれ、ここにはステータスコードが書かれます。
GET 等のリクエストの多くは一般にはメッセージボディは使われません。
http のバージョン1 や 1.1 では全て ascii コードでやり取りされるため、パケットキャプチャで見ると以下のように見えます。
[リクエストの場合]
ASCII で 47=G, 45=E, 54=T ですので、47 45 54 が "GET" という文字列であることが分かります。
[レスポンスの場合]
バージョン2以降ではフォーマットが変わり、ascii だけではなくなりましたが、リクエストやレスポンスの大枠は変わらず残り続けています。
http のバージョン変化や最新バージョンについては以下も併せて参照下さい。
REST API 等で利用される GET と POST について
http は REST API で利用するデータを伝達するプロトコルとしても利用されており、クライアントからだけではなくサーバ間で連携してデータをやり取りするときにも使われます。
データを送り込む実装としては POST はもちろん、GET でも送り込むことができます。
GET の場合は例えば api.php というスクリプトに testval=hoge を送り込みたいときは GET /api.php?testval=hoge というように URL にデータを含めてしまうのです。(POST で URL にデータを含めることも可能です。)
ただし、機密性の高いデータ送信やサーバに状態変化を与えるデータ送信は POST でデータ送信すべきです。
メソッドの種類
メソッドには以下の種類があります。(参考 https://tools.ietf.org/html/rfc7231)
Method | 説明 | リクエストラインの構文例 | 構文例の内容 |
---|---|---|---|
GET | 対象ファイルを ダウンロード | GET /index.html HTTP/1.1 | index.htmlを ダウンロードする |
HEAD | 対象ファイルを GETした時の ヘッダ情報取得 | HEAD /index.html HTTP/1.1 | index.htmlをGET した時のヘッダ(メタ 情報)だけを取得する (index.htmlファイル の中身は取得しない |
POST | データ送信 | POST /form.php HTTP/1.1 ~~ [メッセージボディ] val=hoge | form.phpに "val=hoge"を送る (form.phpがその データを受け取り 処理する |
PUT | ファイル生成 | PUT /new.html HTTP/1.1 ~~ [メッセージボディ] hogeratta | new.htmlの中身 をhogerattaという データを持つ new.htmlを新規作成 (既存同一ファイルが あれば置き換え) (主にWebDAV用) |
DELETE | ファイル削除 | DELETE /new.html HTTP/1.1 | new.htmlを削除する (主にWebDAV用) |
CONNECT | https通信を プロキシ経由 でトンネル | CONNECT www.google.com:443 HTTP/1.1 | ブラウザ等で設定 しているプロキシ サーバに対し www.google.com へのhttps通信を トンネルさせる |
OPTIONS | サーバがサポート しているメソッド やオプション の情報を取得 | OPTIONS /index.html HTTP/1.1 | index.htmlを扱う にあたり、サーバが サポートしている メソッドやオプション の情報を取得する |
TRACE | ループバック試験 (デバッグ用) | TRACE /index.html HTTP/1.1 | リクエストと同じ 内容のレスポンス を受信する |
ステータスコードの種類
ステータスコードには 3 桁の数字で示され、種類は非常に多くあります。
3 桁目の数字が大枠の内容を示しており、100 番台は情報提供、200 番台は成功、300 番台はリダイレクト (別のページに自動で移動)、400 番台はクライアント側のエラー、500 番台はサーバ側のエラーを示します。
まずはよく使うものだけをリストします。
Status Code | ステータス | 説明 | Webサーバの気持ち (例) |
---|---|---|---|
1XX | Informational | 情報提供 | |
100 | Continue | 継続 | 今のところ問題無いね。 経過観察してるよ。 |
2XX | Successful | 成功 | |
200 | OK | 処理完了 | 処理がきちんと完了したよ! |
206 | Partial Content | 部分的に成功 | ajaxで継続処理が必要かも だから待ってるよ! |
3XX | Redirection | リダイレクト | |
301 | Moved Permanently | 恒久的移動 | そのURLはこっちに引っ越したよ! |
302 | Found | 一時的移動 | そのURL、ちょっと今はこっちに 移動してるんだ。 |
304 | Not Modified | 更新無し | そのURL、更新してないから キャッシュから表示してちょ。 |
4XX | Client Error | クライアント側のエラー | |
400 | Bad Request | 不正な要求 | リクエストがフォーマット通りじゃ ないよ。ルールは守ってね。 |
401 | Unauthorized | 未認証 | 認証が必要だから資格情報(ID パスワード)を入力してね。 それを見て200か403を返すからね。 |
403 | Forbidden | 禁止 | 君には見せられないな。 |
404 | Not Found | 見つからない | そのURLのコンテンツファイル,無いよ? |
408 | Request Timeout | 要求タイムアウト | リクエスト待ってたけど来ないから エラーにしちゃった。 |
5XX | Server Error | サーバ側のエラー | |
500 | Internal Server Error | 内部エラー | サーバ側でアプリの処理でエラーが 出ちゃった |
502 | Bad Gateway | 不正なGW | (プロキシ/リバプロの気持ち) なんかアクセス先のWebサーバから 訳分からん応答が来たんだけど。。 途切れ途切れでうまく聞こえんし。 |
503 | Service Unavailable | サービス 利用不可 | 負荷が閾値以上に上がってるから 受け付けいったん止めますね。 |
また、他にも以下の種類があります。(参考 https://tools.ietf.org/html/rfc7231)
Status Code | ステータス | 説明 | Webサーバの気持ち (例) |
---|---|---|---|
1XX | Informational | 情報提供 | |
100 | Continue | 継続 | 今のところ問題無いね。 経過観察してるよ。 |
101 | Switching Protocols | プロトコル変更 | HTTP/1.1からHTTP/2に 切り替えたいの?OK! |
2XX | Successful | 成功 | |
200 | OK | 処理完了 | 処理がきちんと完了したよ! |
201 | Created | 作成完了 | PUTメソッドでファイル 新規作成したよ! |
202 | Accepted | 受付完了 | 受け付けは完了したよ! 処理は今やってるからね! |
203 | Non-Authoritative Information | 信頼性欠如 | (プロキシの気持ち) 昔のキャッシュの情報だから 気を付けてね。 |
204 | No Content | 内容なし | 返すデータが無いから画面更新 しないでいいよ! |
205 | Reset Content | 内容のリセット | リクエストは受け付けたよ! 画面は初期化してね! |
206 | Partial Content | 部分的に成功 | ajaxで継続処理が必要かも だから待ってるよ! |
3XX | Redirection | リダイレクト | |
300 | Multiple Choices | 複数選択 | そのURLのコンテンツ、実は2つ あるんだ。どっちがいい? |
301 | Moved Permanently | 恒久的移動 | そのURLはこっちに引っ越したよ! |
302 | Found | 一時的移動 | そのURL、ちょっと今はこっちに 移動してるんだ。 |
303 | See Other | 他を参照 | ちょっとこっちのコンテンツ見てみ。 |
304 | Not Modified | 更新無し | そのURL、更新してないから キャッシュから表示してちょ。 |
305 | Use Proxy | プロキシ利用 | プロキシ使ってアクセスしてちょ。 |
306 | (Unused) | 未使用 | 将来用に予約してるよ! |
307 | Temporary Redirect | 一時的移動 | そのURL、ちょっと今はこっちに移動 してるんだけど、メソッドは絶対に 変えるなよ!いいか?俺は302の ように甘くないからな? 絶対変えるなよ? |
4XX | Client Error | クライアント側のエラー | |
400 | Bad Request | 不正な要求 | リクエストがフォーマット通りじゃ ないよ。ルールは守ってね。 |
401 | Unauthorized | 未認証 | 認証が必要だから資格情報(ID パスワード)を入力してね。 それを見て200か403を返すからね。 |
402 | Payment Required | 支払え | 金払えよ? |
403 | Forbidden | 禁止 | 君には見せられないな。 |
404 | Not Found | 見つからない | そのURLのコンテンツファイル,無いよ? |
405 | Method Not Allowed | メソッド不許可 | おいおい、DELETEなんてできるわけ なかろう? |
406 | Not Acceptable | 受付不可 | gzip圧縮は対応してないから 受け付けないよ。 |
407 | Proxy Authentication Required | 要プロキシ認証 | プロキシ認証が必要だよ。 |
408 | Request Timeout | 要求タイムアウト | リクエスト待ってたけど来ないから エラーにしちゃった。 |
409 | Conflict | 競合 | PUT受け付けようとしたけど今 別のクライアントからPUTされ てるから受け付けられないよ。 |
410 | Gone | 完全撤収 | そのURL、確かに前まであったよ。 でももう無いし、今後も絶対に 戻さないからね。 |
411 | Lenth Required | Lenthが必要 | Content-Length ヘッダフィールドを 付けてね。 |
413 | Payload Too Large | ペイロード 大きすぎ | お前、話が長すぎ。切るよ。 |
414 | URI Too Long | URI 長すぎ | チョ☆チョニッシーナマッソコぶれッ シュ☆エスボ・・・なんて? |
415 | Unsupported Media Type | メディアタイプ 未サポート | そのContent-Type,未サポートっす。 |
417 | Expectation Failed | 予想失敗 | Expect ヘッダフィールドに 「100 Continue」入れられても・・ サポートしてないからFailな。 |
426 | Upgrade Required | Upgrade要求 | HTTP/1.1からHTTP/2に切り替えて 下さいな。 |
5XX | Server Error | サーバ側のエラー | |
500 | Internal Server Error | 内部エラー | サーバ側でアプリの処理でエラーが 出ちゃった |
501 | Not Implemented | 未実装 | MOVEメソッドとか実装してないから 使えないよごめんね。 |
502 | Bad Gateway | 不正なGW | (プロキシ/リバプロの気持ち) なんかアクセス先のWebサーバから 訳分からん応答が来たんだけど。。 途切れ途切れでうまく聞こえんし。 |
503 | Service Unavailable | サービス 利用不可 | 負荷が閾値以上に上がってるから 受け付けいったん止めますね。 |
504 | Gateway Timeout | GWタイムアウト | (プロキシ/リバプロの気持ち) アクセス先のWebサーバからの応答 を待ってたんやが来ないから タイムアウトや。 |
505 | HTTP Version Not Supported | httpバージョン 未サポート | http/999 ってなんやねん。 |
コメント