『Go言語によるWebアプリケーション開発』学習メモ(2日目)
『Go言語によるWebアプリケーション開発』という本での学習の中で、 学んだことを自分用に整理してメモしていきます。
前回から大分時間が空いてしまったのですが、進めていきます。
第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>
実行の流れ
http.Handlerのインターフェースを実装する。templateHandlerは、 HTTPリクエストを直接処理することが出来るようになる
t.onece.Doで、テンプレートファイルを一回だけロードして実行している
dataという、新しいマップを作成し、リクエストから取得したホスト名をHostキーに格納する
リクエストの中からauthという名のcookieを探し、エラーがない場合は、cookieの値をデコードする データは、UserDataというキーで、dataマップに格納される
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() }
メッセージの受信者(クライアント型)は、メッセージを自動的に変換されたJSON形式で受け取る websocket.TextMessageのように、メッセージタイプを指定する必要がなくなる
msgとは?? message構造体のインスタンス chatでの、メッセージ内容などの情報をもつインスタンス type message struct { Name string Message string When time.Time }
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 本日はここまでで、また後日続きを行います