技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

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)
}