http
Goのパッケージを使用してPOSTリクエストを処理しています。Request
オブジェクトからクエリ文字列のコンテンツにアクセスして解析するにはどうすればよいですか?公式ドキュメントから答えが見つかりません。
6 に答える
QueryStringは、定義上、URLに含まれています。req.URL
(doc )を使用してリクエストのURLにアクセスできます。URLオブジェクトには、タイプを返すQuery()
メソッド(docValues
)があります。これは、単にmap[string][]string
QueryStringパラメーターの1つです。
探しているのがHTMLフォームによって送信されたPOSTデータである場合、これは(通常)リクエスト本文のキーと値のペアです。正解です。呼び出しParseForm()
てからフィールドを使用req.Form
してキーと値のペアのマップを取得できますが、呼び出しFormValue(key)
て特定のキーの値を取得することもできます。これはParseForm()
必要に応じて呼び出し、送信方法に関係なく(つまり、クエリ文字列またはリクエスト本文で)値を取得します。
GETパラメータにアクセスする方法のより具体的な例を次に示します。オブジェクトには、 QueryRequest
と呼ばれるそれらを解析するメソッドがあります。
http:// host:port / something?param1=bのようなリクエストURLを想定
func newHandler(w http.ResponseWriter, r *http.Request) {
fmt.Println("GET params were:", r.URL.Query())
// if only one expected
param1 := r.URL.Query().Get("param1")
if param1 != "" {
// ... process it, will be the first (only) if multiple were given
// note: if they pass in like ?param1=¶m2= param1 will also be "" :|
}
// if multiples possible, or to process empty values like param1 in
// ?param1=¶m2=something
param1s := r.URL.Query()["param1"]
if len(param1s) > 0 {
// ... process them ... or you could just iterate over them without a check
// this way you can also tell if they passed in the parameter as the empty string
// it will be an element of the array that is the empty string
}
}
また、「値マップのキー[つまり、Query()の戻り値]では大文字と小文字が区別されます」にも注意してください。
以下に例を示します。
value := r.FormValue("field")
詳細については。httpパッケージについては、こちらのドキュメントをご覧ください。 FormValue
基本的に、POST値またはPUT値、またはGET値を、最初に検出された順序で返します。
クエリパラメータを取得するには、次の2つの方法があります。
- reqeust.URL.Query()の使用
- request.Formを使用する
2番目のケースでは、本文パラメータがクエリパラメータよりも優先されるため、注意が必要です。クエリパラメータの取得に関する完全な説明は、ここにあります。
https://golangbyexample.com/net-http-package-get-query-params-golang
簡単で実用的な例を次に示します。
package main
import (
"io"
"net/http"
)
func queryParamDisplayHandler(res http.ResponseWriter, req *http.Request) {
io.WriteString(res, "name: "+req.FormValue("name"))
io.WriteString(res, "\nphone: "+req.FormValue("phone"))
}
func main() {
http.HandleFunc("/example", func(res http.ResponseWriter, req *http.Request) {
queryParamDisplayHandler(res, req)
})
println("Enter this in your browser: http://localhost:8080/example?name=jenny&phone=867-5309")
http.ListenAndServe(":8080", nil)
}
以下の言葉は公式文書から来ています。
フォームには、 URLフィールドのクエリパラメータとPOSTまたはPUTフォームデータの両方を含む、解析されたフォームデータが含まれます。このフィールドは、ParseFormが呼び出された後にのみ使用できます。
したがって、以下のサンプルコードが機能します。
func parseRequest(req *http.Request) error {
var err error
if err = req.ParseForm(); err != nil {
log.Error("Error parsing form: %s", err)
return err
}
_ = req.Form.Get("xxx")
return nil
}