Go

フォームからPOSTされた値をstructにバインドできるbindformを書いた

More than 3 years have passed since last update.

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の存在に気づいた。リフレクション使ってなくて高速っぽい。