Goのhttpパッケージで、POSTリクエストのクエリ文字列を取得するにはどうすればよいですか?


113

httpGo のパッケージを使用してPOSTリクエストを処理しています。Requestオブジェクトからクエリ文字列のコンテンツにアクセスして解析するにはどうすればよいですか?公式ドキュメントから答えを見つけることができません。


覚えておくべきことの1つは、cURLを使用してリクエストを送信しr.FormValue("id")、クエリパラメータをフェッチする場合、cURLのフォームデータを介してiを送信することはできません(つまり、機能しcurl 0.0.0.0:8888 -d id=foobarません)。クエリパラメータ(curl 0.0.0.0:8888?id=foobar)を介して送信する必要があります。

回答:


144

QueryStringは、定義上、URL内にあります。req.URLdoc)を使用してリクエストのURLにアクセスできます。URLオブジェクトには、タイプを返すQuery()メソッド(doc)がありValues、これは単にmap[string][]stringQueryStringパラメータの1つです。

探しているものがHTMLフォームによって送信された POSTデータである場合、これは(通常)リクエスト本文のキーと値のペアです。答えは正しいので、呼び出してParseForm()からreq.Formフィールドを使用してキーと値のペアのマップを取得できますが、呼び出しFormValue(key)て特定のキーの値を取得することもできます。これはParseForm()必要に応じて呼び出され、送信方法(クエリ文字列またはリクエスト本文)に関係なく値を取得します。


2
精度をありがとう。
Fabien

2
'req.FormValue(key)'メソッドの方が速く、URLを事前に解析するために必要なすべてのコードを実行します。
OnlyAngel 2014年

6
req.URL.RawQuery?GETリクエストの後で、それが役立つ場合はすべてを返します。
kouton 2014

req.formValue( "some_field")が少なくとも一度呼び出されない限り、興味深いreq.Formは空の配列であることがわかりました。
Qian Chen

トンありがとう!@kouton
Aditya Varma

127

GETパラメータにアクセスする方法のより具体的な例を次に示します。Requestオブジェクトは、あなたが呼ばれるためにそれらを解析している方法でクエリを

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=&param2= param1 will also be "" :|
  }

  // if multiples possible, or to process empty values like param1 in
  // ?param1=&param2=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()戻り値]は大文字と小文字が区別されます。」


4
前の回答は、すでに言及しただけ(と、それは目的のフィールドには、使用存在しない場合は境界のスライス基準のうちでパニックになる例がないことをやってのドキュメントにリンクされr.URL.Query().Get("moviename")、この致命的な間違いを避けるために)。
Dave C

1
情報をありがとう。ええ、ドキュメントは私にとって少しわかりにくいので、役立つ場合に備えて、これを「実践的な例」として投稿しました。nilチェックを修正しました。Getメソッドを使用すると、複数ある場合に最初のものが返されるだけなので、これはさらに多くの例です。役立つ情報、ありがとうございます!
rogerdpack 2015年

また、文字列をnilと比較できないと思います。devs.cloudimmunity.com / gotchas-and-common-mistakes-in-go-golang ie string!= "" is valid
James Milner

完全な例では、コードがコンパイルされるとは思いません。あなたは、空の文字列を比較することはできませんValues.Get()リターンとをnilgolang.org/pkg/net/url/#Values
Daniel Farrell

19

以下に例を示します。

value := r.FormValue("field")

詳細については。httpパッケージについては、こちらのドキュメントをご覧くださいFormValue基本的に、POSTまたはPUT値、またはGET値をこの順序で返します。最初に見つかった値が返されます。


8

簡単で実用的な例を次に示します。

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

ここに画像の説明を入力してください



5

以下の言葉は公式文書からのものです。

フォームには、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
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.