#HTTPとは
HTTPの概要
HTTPとは、WebサーバとWebクライアントの間でデータの送受信を行うために用いられるプロトコル
(引用元)http://e-words.jp/w/HTTP.html
- プロトコルとは、難しく言うと通信規約、簡単に言えば約束事や取り決めのこと
- つまり、Webサーバとクライアントは、HTTPというプロトコル(決まった方法)でやりとりしましょうねということ
HTTP通信の中身
- HTTPでサーバとクライアントがやりとりするメッセージ(HTTPメッセージ)は基本的に以下のような形になっている
メッセージヘッダ
空行(CR+LF)
メッセージボディ
- リクエストメッセージ(クライアント=>サーバへのメッセージ)は具体的には以下のようなものである
GET /index.html HTTP/1.1
Host: localhost:8080
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36
Accept: */*
Referer: http://localhost:8080/
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: ja,en-US;q=0.8,en;q=0.6
※今回は、リクエストメソッドがGETのため、リクエストボディは存在しない(存在する場合については後述する)
リクエストヘッダ
- 2行目~ 空行までの部分
- リクエストについての情報や属性が書かれている
### リクエストライン
- 1行目の以下の部分
GET /index.html HTTP/1.1
このステータスラインの個々の部品を左から
- GET = リクエストメソッド
- /index.html = リクエストURI
- HTTP/1.1 = HTTPのバージョン
という
リクエストメソッド
- クライアントからサーバに対するリクエストの方法
リクエストURI
- クライアントからサーバに対するリクエスト対象のリソース(サーバ内に保管されているリソース)
HTTPのバージョン
-
この通信で使うHTTPのバージョン
-
簡単に言うと、/index.htmlというリソースを、HTTPの1.1バージョンの通信で、GETというリクエストの方法で、クライアントからサーバに要求している。
GETとPOST
HTTPのメソッドは、その用途によってGETとPOSTで使い分ける必要がある。(他にもPUTとかDELETEとかあるけど、本記事ではGETとPOSTだけ扱う)
GET
- HTTP通信で、サーバから情報を取得してくる時に使用する
- 他人に見られたくない情報は、GETでは送らない(後述する)
- 送信できるデータ量に制限がある
- ブックマークに保存する場合
- テキストデータのみ送信できる(バイナリデータは送信できない)
GETでのサーバへのデータの送信方法
- リクエスト時にサーバへ送信するデータはリクエストURLの後に付け加えられる
http://localhost:8080/index.html?hoge=hoge
- ?より後の文字をクエリストリングといい、送信するデータを表す(クエリストリングについては後述)
- このように送信するデータがアドレスバーに表示されてしまうため、他人に見られる可能性があるので、他人に見られたくない情報は、GETでは送らない
クエリストリング
クエリ文字列とは、WebブラウザなどがWebサーバに送信するデータをURLの末尾に特定の形式で表記したもの。
Webアプリケーションなどでクライアントからサーバにパラメータを渡すのに使われる表記法で、URLの末尾に「?」マークを付け、続けて「名前=値」の形式で記述する。値が複数あるときは「&」で区切り、
例えば以下のように記述する
http://example.com/foo?name1=value1&name2=value2
(引用元)
http://e-words.jp/w/%E3%82%AF%E3%82%A8%E3%83%AA%E6%96%87%E5%AD%97%E5%88%97.html
下記の?hoge=1&foo=2がクエリストリングに該当する
http://localhost:8080/index.html?hoge=1&foo=2
- 「名前=値」の形で表される
この場合は以下の2つのデータを送信していることがわかる
「hogeが名前、1が値」、「fooが名前、2が値」
## パーセントエンコーディング(URLエンコーディング)
- 日本語などの文字は、そのままではURLで送信することができない
- そのような文字をURLに付与して送信するには、パーセントエンコーディング(URLエンコーディング)という技術を使用する。
- URLで扱えない文字を「%xx」(xx:16進数)で表現する
- XXの部分は、使用する文字コードによって異なる
このパーセントエンコーディングはHTTP通信においては、以下の箇所で利用される
- URLのパス
- クエリストリング(GETパラメータ部分)
- リクエストボディ(POSTパラメータ)
POST
- HTTP通信で、サーバへ情報を登録する時に使用する(データベースへの格納など)
- データ量が多い場合(GETでのデータ送信量制限を超えてしまう場合)
- バイナリデータを送信したい場合
- 他の人に見られたくない情報を送る場合(パスワードなど)
POSTでのサーバへのデータの送信方法
- POSTでサーバにデータを送信する際は、リクエストボディにデータが記述される
- POSTでのサーバからクライアントへのリクエスト例
POST /hoge/ HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 22
Cache-Control: max-age=0
Origin: http://localhost:8080
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://localhost:8080/hoge/
Accept-Encoding: gzip, deflate, br
Accept-Language: ja,en-US;q=0.8,en;q=0.6
name=hoge&comment=hoge
- 上記のように、リクエストヘッダの後に一行、空行が入り、その後POSTで送信したクエリストリングが、リクエストボディとしてクライアントからサーバへと送信されてくる
- リクエストボディの長さは、「Content-Length:」という項目で表される
Webサーバ(HTTPサーバ)とは
- クライアントからのリクエストに対して静的なリソースを返す
- 動的なリソースを返したい場合は、アプリケーションサーバ
参考にさせていただいたサイト
https://www.ietf.org/rfc/rfc2616.txt(rfc2616)
https://triple-underscore.github.io/RFC2616-ja.html
https://www.seohacks.net/blog/seo-tech/1147/
https://www.ietf.org/rfc/rfc3986.txt
http://www.atmarkit.co.jp/ait/articles/0801/18/news124.html
参考文献
- 上野 宣(2013/5/25)『HTTPの教科書 』翔泳社
- 小森 裕介 (2010/4/10)『「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか』技術評論社
※ ブログでも同一記事を投稿している
http://www.sekky0905.com/entry/2016/12/08/%E3%80%90HTTP%E3%80%91HTTP%E3%81%A8GET%E3%80%81POST