雑食日誌

Vue.jsとServerless。ときどきチーム開発

HTTP入門

こんにちは、ぬまやんです。最近Goプログラミング実践入門を購入しました。この本を元にWebアプリやHTTPについて勉強した内容をまとめてみます。多数見当違いな記述もあると思いますが、ご指摘お願いいたします。

1. HTTPの定義

  • クライアント(ユーザー側)とサーバー(サービス提供側)をリクエスト/レスポンスの1回のやりとりで完結させる通信

例: twiiter
ユーザーがツイート検索することでリクエストがサーバーに送信され、サーバーがレスポンスを返して、検索結果をブラウザに表示

  • HTTP1.Xではリクエスト/レスポンスはテキストベースにて行われていたが、HTTP2.0になるとバイナリ

1.1 HTTPリクエス

  • リクエストは以下の構成からなる
  • リクエストヘッダの後にはメッセージがなくても空行を必ず挟むこと
GET /example.com/hatena.html HTTP/1.3
User-Agent: Mozilla/5.0

(メッセージ本体)
  1. リクエスト行(メソッド URI バージョン)
  2. リクエストヘッダ (0行以上)
  3. 空行
  4. メッセージ本体(省略可能)

リクエストメソッド

  • リクエストメソッドはWebアプリに対して、処理してほしい要求内容を表す
  • 主要なメソッドと要求内容を記載する
    • GET: 指定するリソースの返却
    • POST: メッセージ本体のデータをリソースに送信(送信後の処理内容はサーバーが決定)
    • PUT: メッセージ本体のデータをリソースに置き換え
    • DELETE: リソースの削除
  • POSTとPUTは2回同様のメソッドを送信した時にサーバの状態が変更されるか否かが異なる
    • POSTは2回サーバに送信した時にサーバ状態が変更される場合がある
    • PUTは2回サーバに送信した時、2回目はサーバの状態を変更しない

リクエストヘッダ

  • リクエストに付随する情報が表示される
  • 主要なヘッダを記載する
    • Content-Length: メッセージ本体のバイト数
    • Host: サーバ名とポート番号
    • User-Agent: クライアント情報

1.2 HTTPレスポンス

  • レスポンスの構成をリクエスト同様表示する
  • リクエスト同様にヘッダの後には必ず空行を含める
200 OK
Date: 05 Nov 2017 10:02:59 GMT
Content-Length: 712300

<!DOCTYPE html> (リクエストHTML)
  1. ステータス
  2. レスポンスへッダ (0行以上)
  3. 空行
  4. HTML

レスポンスステータス

  • レスポンスはステータスによって結果を要約している
  • 以下に主要レスポンスを記す
    • 1XX: サーバがリクエストを受信し、処理中である状態
    • 2XX: クライアントのリクエストを元に処理が成功した状態
    • 3XX: サーバがリクエストを処理したが、クライアントからの追加情報を待っている状態
    • 4XX: クライアントエラーであり、リクエストを見直す必要がある(404 Not Foundなど)
    • 5XX: サーバエラーであり、サーバ側の不具合のためリトライすると成功する可能性がある

レスポンスヘッダ

  • リクエストヘッダと同様な記法でリクエスト結果の情報が記載されている
  • 以下に主要なヘッダを記載する
    • Allow: サーバのサポートしているリクエストメソッドを記載
    • Server: ドメイン
    • Date: 日時

2. Webアプリケーション

  • WebアプリケーションはHTTPを用いて以下の動作を行うシステム

    1. HTTPを介してリクエストメッセージを受信
    2. リクエストから処理を行う
    3. 結果を元にHTMLとレスポンスを生成してクライアントに送信
  • これらの処理を行うために、Webアプリケーション内にはハンドラとテンプレートエンジンの二つの構成がある

2.1 ハンドラ

  • クライアントからのリクエストを受信し、処理を行うもの
  • 一般的にハンドラをHTTPメッセージ処理を行うコントローラとアプリケーション処理を行うモデルに分割する

2.2 テンプレートエンジン

  • クライアントに返却するHTMLを作成するもの
  • 静的テンプレートとアクティブテンプレートに分かれる
    • 静的テンプレート: HTMLにあらかじめ入力項目を設けて、リクエストを元に埋め込んでいくもの
    • アクティブテンプレート: 条件式や繰り返しを用いてHTMLを動的に生成するもの(PHPはアクティブテンプレートから始まった)

感想

  • HTTPの仕組みのシンプルさが直感的でとてもわかりやすかったです
  • 常に広く普及する仕組みにわかりやすさは欠かせないものであると実感しました