【図解/初心者向け】httpフォーマットとメソッド/ステータスコード一覧 ~getとpostの違い,よく使われるものとか原因とか~

http のメソッドとステータスコード

http はクライアントからメソッドで要求(リクエスト)を投げ、サーバ側でリクエスト内容と状況に応じたステータスコードを応答(レスポンス)します。

メソッド

よく使われるメソッドGETPOST です。

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 のバージョン変化や最新バージョンについては以下も併せて参照下さい。

【図解】HTTP/3 (HTTP over QUIC) の仕組み〜UDPのメリット,各バージョンの違い(v1.0/v1.1/v2/v3)〜
【図解】HTTP/3 (HTTP over QUIC) の仕組み〜UDPのメリット,各バージョンの違い(v1.0/v1.1/v2/v3)〜
インターネットの普及に貢献してきた HTTP プロトコル、その新バージョンである...

REST API 等で利用される GET と POST について

http は REST API で利用するデータを伝達するプロトコルとしても利用されており、クライアントからだけではなくサーバ間で連携してデータをやり取りするときにも使われます。

データを送り込む実装としては POST はもちろん、GET でも送り込むことができます。

GET の場合は例えば api.php というスクリプトに testval=hoge を送り込みたいときは GET /api.php?testval=hoge というように URL にデータを含めてしまうのです。

また、POST の場合ではメッセージボディで送ることもできますが、ヘッダフィールドに載せてもデータを送信できます。このあたりはサーバアプリケーションの仕様に依存します。

データ量が大きいときには POST のほうが無難です。(URL が長いとアプリ側の対応が必要になる可能性もあるため)

メソッドの種類

メソッドには以下の種類があります。(参考 https://tools.ietf.org/html/rfc7231)

Method説明リクエストラインの構文例構文例の内容
GET対象ファイルを
ダウンロード
GET /index.html HTTP/1.1index.htmlを
ダウンロードする
HEAD対象ファイルを
GETした時の
ヘッダ情報取得
HEAD /index.html HTTP/1.1index.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.1new.htmlを削除する
(主にWebDAV用)
CONNECThttps通信を
プロキシ経由
でトンネル
CONNECT www.google.com:443
HTTP/1.1
ブラウザ等で設定
しているプロキシ
サーバに対し
www.google.com
へのhttps通信を
トンネルさせる
OPTIONSサーバがサポート
しているメソッド
やオプション
の情報を取得
OPTIONS /index.html HTTP/1.1index.htmlを扱う
にあたり、サーバが
サポートしている
メソッドやオプション
の情報を取得する
TRACEループバック試験
(デバッグ用)
TRACE /index.html HTTP/1.1リクエストと同じ
内容のレスポンス
を受信する

ステータスコードの種類

ステータスコードには3桁の数字で示され、種類は非常に多くあります。

3桁目の数字が大枠の内容を示しており、100番台は情報提供、200番台は成功、300番台はリダイレクト(別のページに自動で移動)、400番台はクライアント側のエラー、500番台はサーバ側のエラーを示します。

まずはよく使うものだけをリストします。

Status
Code
ステータス説明Webサーバの気持ち (例)
1XXInformational情報提供
100Continue継続今のところ問題無いね。
経過観察してるよ。
2XXSuccessful成功
200OK処理完了処理がきちんと完了したよ!
206Partial Content部分的に成功ajaxで継続処理が必要かも
だから待ってるよ!
3XXRedirectionリダイレクト
301Moved Permanently恒久的移動そのURLはこっちに引っ越したよ!
302Found一時的移動そのURL、ちょっと今はこっちに
移動してるんだ。
304Not Modified更新無しそのURL、更新してないからブラウザ
のキャッシュから表示してちょ。
4XXClient Errorクライアント側のエラー
400Bad Request不正な要求リクエストがフォーマット通りじゃ
ないよ。ルールは守ってね。
401Unauthorized未認証認証が必要だから資格情報(ID
パスワード)を入力してね。
それを見て200か403を返すからね。
403Forbiden禁止君には見せられないな。
404Not Found見つからないそのURLのコンテンツファイル,無いよ?
408Request Timeout要求タイムアウトリクエスト待ってたけど来ないから
エラーにしちゃった。
5XXServer Errorサーバ側のエラー
500Internal Server Error内部エラーサーバ側でアプリの処理でエラーが
出ちゃった
502Bad Gateway不正なGW(プロキシ/リバプロの気持ち)
なんかアクセス先のWebサーバから
訳分からん応答が来たんだけど。。
途切れ途切れでうまく聞こえんし。
503Service Unavailableサービス
利用不可
負荷が閾値以上に上がってるから
受け付けいったん止めますね。

また、他にも以下の種類があります。(参考 https://tools.ietf.org/html/rfc7231)

Status
Code
ステータス説明Webサーバの気持ち (例)
1XXInformational情報提供
100Continue継続今のところ問題無いね。
経過観察してるよ。
101Switching
Protocols
プロトコル変更HTTP/1.1からHTTP/2に
切り替えたいの?OK!
2XXSuccessful成功
200OK処理完了処理がきちんと完了したよ!
201Created作成完了PUTメソッドでファイル
新規作成したよ!
202Accepted受付完了受け付けは完了したよ!
処理は今やってるからね!
203Non-Authoritative
Information
信頼性欠如(プロキシの気持ち)
昔のキャッシュの情報だから
気を付けてね。
204No Content内容なし返すデータが無いから画面更新
しないでいいよ!
205Reset Content内容のリセットリクエストは受け付けたよ!
画面は初期化してね!
206Partial Content部分的に成功ajaxで継続処理が必要かも
だから待ってるよ!
3XXRedirectionリダイレクト
300Multiple Choices複数選択そのURLのコンテンツ、実は2つ
あるんだ。どっちがいい?
301Moved Permanently恒久的移動そのURLはこっちに引っ越したよ!
302Found一時的移動そのURL、ちょっと今はこっちに
移動してるんだ。
303See Other他を参照ちょっとこっちのコンテンツ見てみ。
304Not Modified更新無しそのURL、更新してないからブラウザ
のキャッシュから表示してちょ。
305Use Proxyプロキシ利用プロキシ使ってアクセスしてちょ。
306(Unused)未使用将来用に予約してるよ!
307Temporary Redirect一時的移動そのURL、ちょっと今はこっちに移動
してるんだけど、メソッドは絶対に
変えるなよ!いいか?俺は302の
ように甘くないからな?
絶対変えるなよ?
4XXClient Errorクライアント側のエラー
400Bad Request不正な要求リクエストがフォーマット通りじゃ
ないよ。ルールは守ってね。
401Unauthorized未認証認証が必要だから資格情報(ID
パスワード)を入力してね。
それを見て200か403を返すからね。
402Payment Required支払え金払えよ?
403Forbiden禁止君には見せられないな。
404Not Found見つからないそのURLのコンテンツファイル,無いよ?
405Method Not Allowedメソッド不許可おいおい、DELETEなんてできるわけ
なかろう?
406Not Acceptable受付不可gzip圧縮は対応してないから
受け付けないよ。
407Proxy Authentication
Required
要プロキシ認証プロキシ認証が必要だよ。
408Request Timeout要求タイムアウトリクエスト待ってたけど来ないから
エラーにしちゃった。
409Conflict競合PUT受け付けようとしたけど今
別のクライアントからPUTされ
てるから受け付けられないよ。
410Gone完全撤収そのURL、確かに前まであったよ。
でももう無いし、今後も絶対に
戻さないからね。
411Lenth RequiredLenthが必要Content-Length ヘッダフィールドを
付けてね。
413Payload Too Largeペイロード
大きすぎ
お前、話が長すぎ。切るよ。
414URI Too LongURI 長すぎチョ☆チョニッシーナマッソコぶれッ
シュ☆エスボ・・・なんて?
415Unsupported
Media Type
メディアタイプ
未サポート
そのContent-Type,未サポートっす。
417Expectation Failed予想失敗Expect ヘッダフィールドに
「100 Continue」入れられても・・
サポートしてないからFailな。
426Upgrade RequiredUpgrade要求HTTP/1.1からHTTP/2に切り替えて
下さいな。
5XXServer Errorサーバ側のエラー
500Internal Server Error内部エラーサーバ側でアプリの処理でエラーが
出ちゃった
501Not Implemented未実装MOVEメソッドとか実装してないから
使えないよごめんね。
502Bad Gateway不正なGW(プロキシ/リバプロの気持ち)
なんかアクセス先のWebサーバから
訳分からん応答が来たんだけど。。
途切れ途切れでうまく聞こえんし。
503Service Unavailableサービス
利用不可
負荷が閾値以上に上がってるから
受け付けいったん止めますね。
504Gateway TimeoutGWタイムアウト(プロキシ/リバプロの気持ち)
アクセス先のWebサーバからの応答
を待ってたんやが来ないから
タイムアウトや。
505HTTP Version
Not Supported
httpバージョン
未サポート
http/999 ってなんやねん。