技術はあとからついてくる。

技術はあとからついてくる。

就活開始の半年前にエンジニアに目覚めた人

HTTPまわり深掘り ①

主にレスポンスあたり

HTTPでは実際にはどのようなデータとして送られているか?見るためには?

HTTPレスポンスについて

-Iのオプションを付ければ、レスポンスボディは取得せず、ステータスラインとレスポンスヘッダのみを見ることができる。

curl -I https://www.google.com
// googleアクセス時のhttpレスポンス

HTTP/2 200
date: Sun, 18 Nov 2018 14:41:22 GMT
expires: -1
cache-control: private, max-age=0
content-type: text/html; charset=ISO-8859-1
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-11-18-14; expires=Tue, 18-Dec-2018 14:41:22 GMT; path=/; domain=.google.com
set-cookie: NID=146=HI9Ufb35Vaa1GR_gk3uLIXL9rdStF38USe7MrwqRo2rjzSyMGVGg0s_zcA8aznD8lfjvAUg4BFuPunDnk1pAnAg1zY9xZ11Ykr2VJc5SllbKilNF3CWeesXXduz2OvXRzdjsPxNp-ICmos8qPLNDbSqHKoif5vrshtzKoynoiHE; expires=Mon, 20-May-2019 14:41:22 GMT; path=/; domain=.google.com; HttpOnly
alt-svc: quic=":443"; ma=2592000; v="44,43,39,35"
accept-ranges: none
vary: Accept-Encoding

GETメソッドとPOSTメソッドは、実際にhttp通信の中身だと違うか?

GETは主に読み込み(Read)、POSTは主に作成(Create)で使用されるため、GETとPOSTで同じリソースへアクセスしても全く別の結果が返ってくる。

GETリクエストサンプル

http://example.jp/list (仮)へGETリクエストを送る。

リクエスト
GET /list HTTP/1.1
HOST: example.jp
レスポンス
HTTP/1.1 200 OK
Content-Type: application/json

[
  {"url":"http://example.jp/list/item1"},
  {"url":"http://example.jp/list/item2"},
  {"url":"http://example.jp/list/item3"},
  {"url":"http://example.jp/list/item4"},
]

上記のリクエストはhttp://example.jp/list へGETリクエストを送ったものだが、サーバーはリクエストに対して、指定されたURIに対するデータの一覧をレスポンスとして返す。

POSTリクエストサンプル

リクエスト
POST /list HTTP/1.1
Host: example.jp
Content-Type: text/plain; charset=utf-8

こんにちは!
レスポンス
HTTP/1.1 201 Created
Content-Type: text/plain; charset=utf-8
Location: http://example.jp/list/item5
こんにちは!

上記のリクエストはhttp://example.jp/list へPOSTリクエストを送ったものであり、サーバーはこのリクエストで、http://example.jp/list に対して、新しい小リソースを作成する。(item5)

まとめ

  • 同じリソースへのリクエストであっても、GETとPOSTはそれぞれHTTPリクエストに対して別の処理を返し、挙動は異なる。
  • 主にPOSTに対する細かい挙動はサーバー側のプログラムにより決定されている。
  • GETは送ることのできるデータ量が制限されているため、大量のデータを送信したい場合はPOSTメソッドを用いることとなる。