Help us understand the problem. What is going on with this article?

改めてHTTPを学ぶ

More than 1 year has passed since last update.

はじめに

この記事は?

改めてHTTPについて学んだことをまとめた記事。

対象者

仕事でなんとなくHTTPに触れているが、いざ「HTTPってなに?」と聞かれると答えにつまる人

HTTPとは

Hypertext Transfer Protocolの略。

Hypertextってなに?

Hypertextとは、複数の文書(テキスト)を相互に参照できる仕組み。
「テキストを超える」という意味から"hyper"(〜を超えた)"text"(文書)と名付けられた。

文書間の参照は、Hyperlinkという、コンピュータに理解できる形式で記述されており、瞬時に参照先の文章を閲覧できる。

最も有名なHypertextの実装はWorld Wide Webである。ネットワーク上でリンクされたHyperlinkのつながりが、あたかも蜘蛛の巣のように見えることから、この名(世界に広がる蜘蛛の巣)がついた。

また、Hypertextを記述するためのマークアップ言語の1つとしてHTML(Hypertext Markup Language)がある。

Transferってなに?

対象をある場所から別の場所へ送ること。

Protocolってなに?

(情報工学分野では)マシンやソフトウェア同士のやりとりに関する取り決め。

つまりHTTPとは?

Hypertextをマシンやソフトウェア間でやりとりする上での取り決め。

どんな取り決め?

登場人物はクライアントサーバーの2つ。
クライアントがサーバーへリクエストを送り、サーバーはそれを受けてクライアントへレスポンスを返す。

例えばwww.google.co.jpGETリクエストを送ったとすると

$ curl -v www.google.co.jp 

リクエスト

> GET / HTTP/1.1          # リクエストライン
> Host: www.google.co.jp  # ここからヘッダ
> User-Agent: curl/7.54.0
> Accept: */*             # ここまでヘッダ
                          # 以下ボディが続く場合もある

1. リクエストライン

この部分

GET / HTTP/1.1

HTTPリクエストで一番重要な部分。
HTTPメソッド(GET)、URI(/)、HTTPバージョン(HTTP/1.1)から成り立つ。

HTTP1.1ではメソッドは8つ定義されているが、その中で主に使うのは以下の4つ。

メソッド 意味
GET リソースの取得
POST 子リソースの作成、リソースへのデータの追加、そのほかの処理
PUT リソースの更新、リソースの作成
DELETE リソースの削除

HTTP1.1の場合、リクエストURIの形式はパス(/)でも絶対URI(www.google.co.jp)でもよい。

2. リクエストヘッダ

この部分

> Host: www.google.co.jp
> User-Agent: curl/7.54.0
> Accept: */* 

各ヘッダは「名前:値」という構成をしている。
Hostヘッダは必須。
いろんなヘッダがある。

ヘッダ名 意味
Host 必須。リクエストの送信先ホスト名やポート番号を指定する www.google.co.jp
Accept クライアントが受け取ることのできるデータの種類(MIMEタイプ) text/html, application/json
Accept-Language クライアントが受け取ることのできる自然言語の種類 ja-JP, en-gb, fr
User-Agent クライアントの情報。アプリケーション名、バージョン、ホストOSなど Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1C28 Safari/419.3
APIKey APIアクセス時の認証に必要なキー APIによる
Authorization 認証・認可の種類とcredential Basic YWxhZGRpbjpvcGVuc2VzYW1l, Bearer mF_9.B5f-4.1JqM

ほかにも色々ある。
こちらに一覧。
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers

3. リクエストボディ

リソースを新しく作成したり更新したりするときは、ここにその情報を入れることもある。
リクエストボディがつくのはPOSTの場合が多い。
JSONデータやパラメータを持たせる場合は、リクエストボディに表現される。

例えば以下のような。

{
    title: "test",
    content: "testtesttesttesttest"
}

レスポンス

< HTTP/1.1 200 OK                     # ステータスライン
< Date: Sun, 18 Feb 2018 01:06:16 GMT # 以下レスポンスヘッダ
< Expires: -1
< Cache-Control: private, max-age=0
< Content-Type: text/html; charset=Shift_JIS
< P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
< Server: gws
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
< Set-Cookie: 1P_JAR=2018-02-18-01; expires=Tue, 20-Mar-2018 01:06:16 GMT; path=/; domain=.google.co.jp
< Set-Cookie: NID=124=lXLnbtWpi0pyPq1YkzvcikNyJ8KGh5N-1HLqY0n-yeTX2_GdooMqeyKRQ6HeoVTUcS9ZqvoZQkKxbPntXEurfeUsl06zpa6HwI0F8dZW5JVLOqHNLt0bnqiLAHWGbg9a; expires=Mon, 20-Aug-2018 01:06:16 GMT; path=/; domain=.google.co.jp; HttpOnly
< Accept-Ranges: none
< Vary: Accept-Encoding
< Transfer-Encoding: chunked          # ここまでレスポンスヘッダ
<                            
<!doctype html><html itemscope=""...  # 以下レスポンスボディ
                                      # 以下省略

1. ステータスライン

この部分

HTTP/1.1 200 OK 

リクエスト同様、レスポンスでもこの1行目が最も重要。
HTTPバージョン(HTTP/1.1)、ステータスコード(200)、レスポンスフレーズ(OK)から成る。

ステータスコードには以下のようなカテゴリが存在する。

ステータスコード 意味 説明
1xx Informational(情報) リクエストの処理が継続していることを表す
2xx Success(成功) リクエストが成功したことを表す
3xx Redirection(リダイレクション) リクエストを完了させるには、さらに動作が必要であることを表す
4xx Client Error(クライアントエラー) クライアント側に起因するエラーのため、リクエストが失敗したことを表す
5xx Server Error(サーバーエラー) サーバー側に起因するエラーのため、リクエストが失敗したことを表す

なかでもよく登場するのがこちらなので、まずはこれを知っておけばよい。

ステータスコード 意味 説明
200 OK リクエストが正常に完了したことを表す
302 Found リクエストされたリソースが別のURIに属していることを表す。リダイレクトで利用される
401 Unauthorized ユーザ認証に失敗したことを表す
403 Forbidden アクセス権限がないため、サーバにリクエストの実行を拒否されたことを表す
404 Not Found リクエストURIに一致するリソースを見つけられなかったことを表す。
500 Internal Server Error サーバ内部のプログラム実行においてエラーが発生したことを表す

2. レスポンスヘッダ

レスポンスの2行目から空行まで。
この部分。

< Date: Sun, 18 Feb 2018 01:06:16 GMT # 以下レスポンスヘッダ
< Expires: -1
< Cache-Control: private, max-age=0
< Content-Type: text/html; charset=Shift_JIS
< P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
< Server: gws
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
< Set-Cookie: 1P_JAR=2018-02-18-01; expires=Tue, 20-Mar-2018 01:06:16 GMT; path=/; domain=.google.co.jp
< Set-Cookie: NID=124=lXLnbtWpi0pyPq1YkzvcikNyJ8KGh5N-1HLqY0n-yeTX2_GdooMqeyKRQ6HeoVTUcS9ZqvoZQkKxbPntXEurfeUsl06zpa6HwI0F8dZW5JVLOqHNLt0bnqiLAHWGbg9a; expires=Mon, 20-Aug-2018 01:06:16 GMT; path=/; domain=.google.co.jp; HttpOnly
< Accept-Ranges: none
< Vary: Accept-Encoding
< Transfer-Encoding: chunked 

3. レスポンスボディ

この部分

<!doctype html><html itemscope="" # 以下省略

今回の場合はリクエスト時にHTML形式を要求しているため、HTMLデータが入っている。
ブラウザを使用している場合はブラウザがそのHTMLデータを解釈して描画する。

JSONをやりとりするAPIなどの場合は、ここにJSONデータが入ってくる。

参考にしたもの

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away