Я использую пакет http
от Go to deal with POST request. Как я могу получить доступ и проанализировать содержимое строки запроса из объекта Request
? Я не могу найти ответ из официальной документации.
В пакете Go http, как мне получить строку запроса в запросе POST?
Ответ 1
QueryString, по определению, в URL. Вы можете получить URL-адрес запроса с помощью req.URL
(doc). Объект URL имеет метод Query()
(doc), который возвращает тип Values
, который представляет собой просто map[string][]string
параметров QueryString.
Если вы ищете данные POST как представлено HTML-формой, то это (обычно) значение ключа в тело запроса. Вы верны в своем ответе, что вы можете вызвать ParseForm()
, а затем использовать поле req.Form
, чтобы получить карту пар ключ-значение, но вы также можете вызвать FormValue(key)
, чтобы получить значение определенного ключа. Это вызывает ParseForm()
, если требуется, и получает значения независимо от того, как они были отправлены (т.е. В строке запроса или в теле запроса).
Ответ 2
Вот более конкретный пример того, как получить доступ к параметрам GET. У объекта Request
есть метод, который анализирует их для вас и называется Query:
Предполагая URL запроса, например, http://хост: порт/что-то? Param1 = b
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()] чувствительны к регистру".
Ответ 3
Ниже приведен пример:
value := r.FormValue("field")
для получения дополнительной информации. О пакете http, вы можете посетить его документацию здесь. FormValue
основном возвращает значения POST или PUT или значения GET в указанном порядке, первое, которое он находит.
Ответ 4
Вот простой, рабочий пример:
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
}