Antworten:
Ein QueryString befindet sich per Definition in der URL. Sie können mit req.URL
( doc ) auf die URL der Anfrage zugreifen . Das URL-Objekt verfügt über eine Query()
Methode ( doc ), die einen Values
Typ zurückgibt , der einfach einer map[string][]string
der QueryString-Parameter ist.
Wenn Sie nach den POST-Daten suchen, die von einem HTML-Formular übermittelt wurden , handelt es sich (normalerweise) um ein Schlüssel-Wert-Paar im Anforderungshauptteil. Sie haben die richtige Antwort, die Sie aufrufen ParseForm()
und dann mithilfe des req.Form
Felds die Karte der Schlüssel-Wert-Paare abrufen können. Sie können jedoch auch aufrufen FormValue(key)
, um den Wert eines bestimmten Schlüssels abzurufen. Dies ruft ParseForm()
bei Bedarf auf und ruft Werte ab, unabhängig davon, wie sie gesendet wurden (dh in der Abfragezeichenfolge oder im Anforderungshauptteil).
req.URL.RawQuery
gibt alles nach ?
einer GET-Anfrage zurück, wenn das hilft.
Hier ist ein konkreteres Beispiel für den Zugriff auf GET-Parameter. Das Request
Objekt verfügt über eine Methode, die sie für Sie analysiert : Abfrage :
Angenommen, eine Anforderungs-URL wie http: // host: port / Something? 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
}
}
Beachten Sie außerdem, dass bei den Schlüsseln in einer Wertezuordnung [dh dem Rückgabewert von Query ()] zwischen Groß- und Kleinschreibung unterschieden wird.
r.URL.Query().Get("moviename")
diese Option, um diesen schwerwiegenden Fehler zu vermeiden).
Get
Methode gibt nur die erste zurück, wenn mehrere vorhanden sind. Dies ist also ein Beispiel für mehr. Nützliche Infos, danke!
Values.Get()
mit der zurückgegeben wird, nicht vergleichen nil
. golang.org/pkg/net/url/#Values
Unten ist ein Beispiel:
value := r.FormValue("field")
Für mehr Information. Informationen zum http-Paket finden Sie in der Dokumentation hier . FormValue
Grundsätzlich werden POST- oder PUT-Werte oder GET-Werte in dieser Reihenfolge zurückgegeben, der ersten, die gefunden wird.
Hier ist ein einfaches, funktionierendes Beispiel:
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)
}
Es gibt zwei Möglichkeiten, Abfrageparameter abzurufen:
Im zweiten Fall muss man vorsichtig sein, da Körperparameter Vorrang vor Abfrageparametern haben. Eine vollständige Beschreibung zum Abrufen von Abfrageparametern finden Sie hier
https://golangbyexample.com/net-http-package-get-query-params-golang
Die folgenden Wörter stammen aus dem offiziellen Dokument.
Das Formular enthält die analysierten Formulardaten, einschließlich der Abfrageparameter des URL-Felds und der POST- oder PUT-Formulardaten . Dieses Feld ist nur verfügbar, nachdem ParseForm aufgerufen wurde.
Beispielcodes wie unten würden also funktionieren.
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
}
r.FormValue("id")
zum Abrufen eines Abfrageparameters verwenden, können Sie i nicht über Formulardaten in cURL senden (dhcurl 0.0.0.0:8888 -d id=foobar
es funktioniert nicht). Sie müssen es über query params (curl 0.0.0.0:8888?id=foobar
) senden .