--- title: 改めてHTTPを学ぶ tags: HTTP author: ayacai115 slide: false --- # はじめに ### この記事は? 改めて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.jp`へ`GET`リクエストを送ったとすると ``` $ 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 # ここまでレスポンスヘッダ <