Réponses:
Une QueryString est, par définition , dans l'URL. Vous pouvez accéder à l'URL de la requête en utilisant req.URL
( doc ). L'objet URL a une Query()
méthode ( doc ) qui renvoie un Values
type, qui est simplement un map[string][]string
des paramètres QueryString.
Si vous recherchez les données POST soumises par un formulaire HTML , il s'agit (généralement) d'une paire clé-valeur dans le corps de la requête. Vous avez raison dans votre réponse que vous pouvez appeler ParseForm()
, puis utiliser req.Form
field pour obtenir la carte des paires clé-valeur, mais vous pouvez également appeler FormValue(key)
pour obtenir la valeur d'une clé spécifique. Cela appelle ParseForm()
si nécessaire et obtient des valeurs indépendamment de la façon dont elles ont été envoyées (c'est-à-dire dans la chaîne de requête ou dans le corps de la requête).
req.URL.RawQuery
renvoie tout après le ?
sur une requête GET, si cela vous aide.
Voici un exemple plus concret de la façon d'accéder aux paramètres GET. L' Request
objet a une méthode qui les analyse pour vous appelée Query :
En supposant une URL de requête comme http: // hôte: port / quelque chose? 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
}
}
Notez également que «les clés d'une mappe de valeurs [c'est-à-dire la valeur de retour de Query ()] sont sensibles à la casse».
r.URL.Query().Get("moviename")
pour éviter cette erreur fatale).
Get
méthode ne renvoie le premier que s'il y en a plusieurs, c'est donc un exemple de plus. Infos utiles, merci!
Values.Get()
renvoie avec nil
. golang.org/pkg/net/url/#Values
Voici un exemple:
value := r.FormValue("field")
pour plus d'informations. à propos du package http, vous pouvez visiter sa documentation ici . FormValue
renvoie essentiellement les valeurs POST ou PUT, ou les valeurs GET, dans cet ordre, le premier qu'il trouve.
Voici un exemple simple et fonctionnel:
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)
}
Il existe deux façons d'obtenir les paramètres de requête:
Dans le second cas, il faut être prudent car les paramètres de corps auront la priorité sur les paramètres de requête. Une description complète de l'obtention des paramètres de requête peut être trouvée ici
https://golangbyexample.com/net-http-package-get-query-params-golang
Les mots ci-dessous proviennent du document officiel.
Le formulaire contient les données du formulaire analysées, y compris les paramètres de requête du champ URL et les données du formulaire POST ou PUT . Ce champ n'est disponible qu'après l'appel de ParseForm.
Ainsi, des exemples de codes comme ci-dessous fonctionneraient.
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")
pour récupérer un paramètre de requête, vous ne pouvez pas envoyer i via des données de formulaire dans cURL (c'est-à-dire quecurl 0.0.0.0:8888 -d id=foobar
cela ne fonctionnera pas). Vous devez l'envoyer via query params (curl 0.0.0.0:8888?id=foobar
).