GolangではJSONを構造体にそのままバインドできるjson.Unmarshalとかがあって、それなりに便利だ。同じようにフォームからPOSTされた値も構造体にバインドできるようにしたい。WAFのいくつかはこれを実現している。
最近あまりWAFを使わずにnet/http
を使うことが多いし、リフレクションの勉強にもなりそうだったので、フォームからPOSTされた値をバインドできるライブラリをつくった。
使い方
リフレクションを使っているので、json.Unmarshal
と同じ感覚で使用できる。
type ContactForm struct {
Name string `form:"name"`
Email string `form:"email"`
Message string `form:"message"`
}
func HandlePostContactForm(w http.ResponseWriter, r *http.Request) {
form := &ContactForm{}
err := bindform.BindPostForm(r, form)
if err != nil {
http.Error(w, "Bad Request", 400)
}
// Debug print
// log.Println(form)
// needs more validations ...
}
構造体にタグをつけておいて、bindform.BindPostForm
、またはbindform.BindForm
を呼ぶだけである。jsonと同じ感覚で利用できて便利。
martini-contrib/bindingと違ってバリデーションなどは実装していないので、バリデーションを行うには自分でやる必要がある。JSONであってもバリデーションが必要になるためここは割り切っている。
なお、作り終わった後にmholt/bindingの存在に気づいた。リフレクション使ってなくて高速っぽい。