『Go言語によるWebアプリケーション開発』学習メモ(2日目)

『Go言語によるWebアプリケーション開発』という本での学習の中で、 学んだことを自分用に整理してメモしていきます。

前回から大分時間が空いてしまったのですが、進めていきます。

www.oreilly.co.jp

第2章 認証機能の追加

ログインしたユーザー名の表示

func (t *templateHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    t.once.Do(func() {
        t.templ =
            template.Must(template.ParseFiles(filepath.Join("templates",
                t.filename)))
    })
    data := map[string]interface{}{
        "Host": r.Host,
    }
    if authCookie, err := r.Cookie("auth"); err == nil {
        data["UserData"] = objx.MustFromBase64(authCookie.Value)
    }
    t.templ.Execute(w, data)
}
       <form id="chatbox">
            {{.UserData.name}}:<br/>
            <textarea></textarea>
            <input type="submit" value="送信" />
        </form>

実行の流れ

  1. http.Handlerのインターフェースを実装する。templateHandlerは、 HTTPリクエストを直接処理することが出来るようになる

  2. t.onece.Doで、テンプレートファイルを一回だけロードして実行している

  3. dataという、新しいマップを作成し、リクエストから取得したホスト名をHostキーに格納する

  4. リクエストの中からauthという名のcookieを探し、エラーがない場合は、cookieの値をデコードする  データは、UserDataというキーで、dataマップに格納される

  5. t.templ.Execute(w, data)でHTMLを作成し、 HTTPレスポンスとして書き込む

JSON形式での送信
WriteJSONメソッドを使用することで、オブジェクトをJSON形式にして、WebSocket経由で 送信を行う。

第1章での実装

func (c *client) write() {
    for msg := range c.send {
        if err := c.socket.WriteMessage(websocket.TextMessage, msg); err != nil {
            break
        }
    }
    c.socket.Close()
}

[]byte型のmsgをそのまま、websocket.TextMessageタイプで送信

第2章での実装

func (c *client) write() {
    for msg := range c.send {
        if err := c.socket.WriteJSON(msg); err != nil {
            break
        }
    }
    c.socket.Close()
}

msgを、JSON形式でエンコードし送信を行う

メッセージの受信者(クライアント型)は、メッセージを自動的に変換されたJSON形式で受け取る websocket.TextMessageのように、メッセージタイプを指定する必要がなくなる

msgとは??
message構造体のインスタンス
chatでの、メッセージ内容などの情報をもつインスタンス

type message struct {
    Name    string
    Message string
    When    time.Time
}

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
本日はここまでで、また後日続きを行います