はむはむエンジニアぶろぐ

365日エンジニアリング

GolangとtelnetによるHTTPリクエスト/レスポンスの確認

GolangでHTTPサーバを立てて、HTTPリクエスト/レスポンスを確認してみます。
telnetを使用することで、どのような仕組みなのか覗くことができます。

サンプルコード: hamuhamu/golang_http_request_header_check
現時点で普遍的なHTTP/1.1で確認します。
RFC2068 で規定されている。

HTTPリクエスト/レスポンス

HTTPリクエスト

HTTPリクエスト」は大きく分けて以下の3要素から構成される。

  • リクエストライン(Request-Line)
  • リクエストヘッダ(Request Header)
  • メッセージボディ(Message Body)

HTTPレスポンス

HTTPレスポンス」は大きく分けて以下の3要素から構成される。

  • ステータスライン(Status-Line)
  • レスポンスヘッダ(Response Header)
  • メッセージボディ(Message Body)

GETによるHTTPリクエスト/レスポンス

localhostにサーバを立ててtelnetでHTTP通信を確立させます。
今回は8080ポートを使用。

$ telnet localhost 8080
Trying ::1...
Connected to localhost.
Escape character is '^]'.
GET /?hoge=fuga HTTP/1.1
Host: localhost

HTTP/1.1 200 OK
Date: Tue, 19 Dec 2017 13:34:41 GMT
Content-Length: 25
Content-Type: text/html; charset=utf-8

<b>Hello, World :fuga</b>

HTTPリクエスト_リクエストライン

GET /?hoge=fuga HTTP/1.1

GETメソッドなので、サーバに渡したい値はURIの後ろにつける

HTTPリクエスト_リクエストヘッダ

Host: localhost

他にもUser-Agentなどを付与できるので、リクエストヘッダは数行からなる。

HTTPリクエスト_メッセージボディ

GETメソッドの場合、メッセージボディは使用しない。
使用したとしてもWebサーバ側で無視されることがある。

HTTPレスポンス_ステータスライン

HTTP/1.1 200 OK

200番なので、無事疎通が取れた。

HTTPレスポンス_レスポンスヘッダ

Date: Tue, 19 Dec 2017 13:34:41 GMT
Content-Length: 25
Content-Type: text/html; charset=utf-8

HTTPレスポンス_メッセージボディ

<b>Hello, World :fuga</b>

POSTによるHTTPリクエスト/レスポンス

$ telnet localhost 8080
Trying ::1...
Connected to localhost.
Escape character is '^]'.
POST / HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 9

hoge=fuga

HTTP/1.1 200 OK
Date: Tue, 19 Dec 2017 14:21:06 GMT
Content-Length: 25
Content-Type: text/html; charset=utf-8

<b>Hello, World :fuga</b>

HTTPリクエスト_リクエストライン

POST / HTTP/1.1

POSTは、GETと違いサーバに渡したい値はURIにつかない。

HTTPリクエスト_リクエストヘッダ

Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 9

GETと違いContent-TypeとContent-Lengthを付与している。

Content-Typeは、メッセージボディのコンテンツの形式を指定している。
画像をPOSTする場合は、画像のContent-Typeを指定する必要がある。

Content-Lengthは、メッセージボディの長さを指定している。
メッセージボディよりもContent-Lengthのほうが短い場合、メッセージボディの値をサーバ側で切り捨てたりする。

HTTPリクエスト_メッセージボディ

hoge=fuga

POSTメソッドは、サーバに渡したい値をメッセージボディに付けることで渡すことができる。

HTTPレスポンス

GETと変わりないので割愛。