web-dev-qa-db-fra.com

Dans le package http de Go, comment puis-je obtenir la chaîne de requête sur une demande POST?

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.

92
Fabien

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

130
mna

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=&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
  }    
}

Notez également que "les clés d'une mappe de valeurs [c'est-à-dire, la valeur renvoyée par Query ()] sont sensibles à la casse."

99
rogerdpack

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é.

12
Muhammad Soliman

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

enter image description here

5
l3x

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
}
4
ChrisLee