143

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

4

6 に答える 6

170

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

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

于 2013-03-14T12:03:54.180 に答える
160

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=&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()の戻り値]では大文字と小文字が区別されます」にも注意してください。

于 2015-03-24T16:09:08.693 に答える
20

以下に例を示します。

value := r.FormValue("field")

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

于 2014-01-09T07:37:39.730 に答える
10

クエリパラメータを取得するには、次の2つの方法があります。

  1. reqeust.URL.Query()の使用
  2. request.Formを使用する

2番目のケースでは、本文パラメータがクエリパラメータよりも優先されるため、注意が必要です。クエリパラメータの取得に関する完全な説明は、ここにあります。

https://golangbyexample.com/net-http-package-get-query-params-golang

于 2019-11-13T17:11:15.027 に答える
9

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

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

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

于 2017-06-22T02:16:59.450 に答える
6

以下の言葉は公式文書から来ています。

フォームには、 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
}
于 2017-06-05T02:13:32.493 に答える