ユーザーがあいさつ文を投稿できるようにしたい場合は、ユーザーによってウェブフォームから送信された情報を処理するロジックが必要です。
Go http packageを使うとフォームのデータの処理が簡単になります。
myapp/hello.goの中身を以下のように書き換えます:
package hello
import (
"fmt"
"html/template"
"net/http"
)
func init() {
http.HandleFunc("/", root)
http.HandleFunc("/sign", sign)
}
func root(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, guestbookForm)
}
const guestbookForm = `
<html>
<body>
<form action="/sign" method="post">
<div><textarea name="content" rows="3" cols="60"></textarea></div>
<div><input type="submit" value="Sign Guestbook"></div>
</form>
</body>
</html>
`
func sign(w http.ResponseWriter, r *http.Request) {
err := signTemplate.Execute(w, r.FormValue("content"))
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
var signTemplate = template.Must(template.New("sign").Parse(signTemplateHTML))
const signTemplateHTML = `
<html>
<body>
<p>You wrote:</p>
<pre>{{.}}</pre>
</body>
</html>
`
ページを再読み込みしてフォームを表示し、メッセージを送信してください。
今回のバージョンでは二つのハンドラを持っています: パス / はrootに紐付けられ、ウェブフォームを表示します。
パス/signはsignに紐付けられ、ウェブフォームによって送信されたデータを表示します。
sign 関数ではr.FormValueを呼び出してフォームデータを取得し、それを signTemplate.Executeに引数として渡し、
描写されたフォームをhttp.ResponseWriterへ記述します。
このテンプレートコードでは、コンテンツは自動的にフィルタされ、HTML特殊文字はエスケープ処理されます。
この自動エスケープ処理は、text/templateと違いhtml/template packageのプロパティです。
このチュートリアルの目的のために、テンプレートは固定文字列として一つのソースファイルに埋め込まれます。 より実践的な例については、このgithubリポジトリで、 起動時に一度だけ読み込まれるテンプレートファイルが通常どのように分割保存されているかを参考にしてください。
ユーザーからの情報を収集できるようになったので、それを保存する場所と保存した情報を取得するロジックが必要です。