http.Request queryパラメータからkeyで値を取得する【Go】
http.RequestのFormValue()メソッドを使用すると、
queryパラメータから、keyを指定した値の取得ができます。
http packageのHandler型へのダックタイピングを、hotdogという型に対して行う例で解説します。
Handler型はinterface型であり、ServeHTTP()メソッドの定義を要求します。
下記例では、hotdog型をHandler型と見なすことができ、hotdog型の変数をhttp.ListenAndServe()の第2引数に指定することができるようになります。
func (m hotdog) ServeHTTP(w http.ResponseWriter, req *http.Request) { // err := req.ParseForm() req.Formの取得に必要な、req.ParseForm()は行わない // if err != nil { // log.Fatal(err) // } data := struct { Method string URL *url.URL Submissions map[string][]string Header http.Header Host string ContentLength int64 Fname string // FormValue()の返り値の型に合わせる }{ req.Method, req.URL, req.Form, req.Header, req.Host, req.ContentLength, req.FormValue("fname"), // queryパラメータから、key: fnameに指定されている値を取得 } tpl.ExecuteTemplate(w, "tpl.gohtml", data) // template tpl.gohtmlにdataを渡して実行 }
FormValue()は引数に文字列をとり、その引数に指定されたkeyに対応する値をqueryパラメータから取得します。
ただし、URLのqueryパラメータよりも、formのPOST、PUTの内容を優先します。
keyの指定がない場合は、空文字を返します。
上記例では、ParseForm()を行わないことをわざわざお見せしましたが、
FormValue()が、必要に応じてParseForm()を行ってくれると説明するためです。
Formフィールドの値を取得するためには、ParseForm()が必要なので、
上記例からFormValue()を取り除くと、Formを取得することができなくなります。
(あくまでFormValue()の説明のためにParseForm()を行いませんでしたが、req.Formを取得するのであれば、わかりやすさのために本来は行うべきでしょう。)
同じkeyに対して複数の値が指定されている場合、FormValue()は最初の値しか返しません。
複数の値を取得したい場合は、PaseForm()を実行したのち、Formフィールドから直接取得する必要があります。
formのチェックボックスから値をとる場合、次のようにします。
func foo(w http.ResponseWriter, req *http.Request) { w.Header().Set("Content-Type", "text/html") var person Person person.Book = req.FormValue("book") == "on" // チェックされた時は「on」になる tpl.ExecuteTemplate(w, "index.gohtml", person) }