J'utilise le package http
de Go pour traiter la demande POST. Comment puis-je accéder et analyser le contenu de la chaîne de requête à partir de l'objet Request
? Je ne trouve pas la réponse dans la documentation officielle.
Un QueryString est, par définition , dans l'URL. Vous pouvez accéder à l'URL de la demande à l'aide de req.URL
( doc ). L'objet URL a une méthode Query()
( doc ) qui renvoie un type Values
, qui est simplement un map[string][]string
des paramètres QueryString.
Si vous recherchez les POST data telles que soumises par un formulaire HTML , il s'agit (généralement) d'une paire clé-valeur dans le corps de la demande. Vous avez raison de dire que vous pouvez appeler ParseForm()
puis utiliser le champ req.Form
pour obtenir la carte des paires clé-valeur, mais vous pouvez également appeler FormValue(key)
pour obtenir la valeur de une clé spécifique. Ceci appelle ParseForm()
si nécessaire, et obtient des valeurs indépendamment de la manière dont elles ont été envoyées (c'est-à-dire dans la chaîne de requête ou dans le corps de la requête).
Voici un exemple plus concret d’accès aux paramètres GET. L'objet Request
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 renvoyée par Query ()] sont sensibles à la casse."
Ci-dessous un exemple:
value := r.FormValue("field")
pour plus d'informations. sur le paquet http, vous pouvez visiter sa documentation ici . FormValue
renvoie en gros POST ou PUT, ou GET, dans cet ordre, le premier trouvé.
Voici un exemple simple et pratique:
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)
}
Les mots ci-dessous proviennent du document officiel.
Form contient les données de formulaire analysées, y compris les paramètres de requête du champ d'URL et données de 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
}