Edited at

HTTPとPOSTとGET


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通信においては、以下の箇所で利用される

1. URLのパス

2. クエリストリング(GETパラメータ部分)

3. リクエストボディ(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