Nel pacchetto http di Go, come ottengo la stringa di query su una richiesta POST?


114

Sto usando il httppacchetto di Go per gestire la richiesta POST. Come posso accedere e analizzare il contenuto della stringa di query Requestdall'oggetto? Non riesco a trovare la risposta dalla documentazione ufficiale.


Una cosa da tenere a mente, se stai usando cURL per inviare richieste e usi r.FormValue("id")per recuperare un parametro di query, non puoi inviare i attraverso i dati del modulo in cURL (cioè, curl 0.0.0.0:8888 -d id=foobarnon funzionerà). È necessario inviarlo tramite query params ( curl 0.0.0.0:8888?id=foobar).

Risposte:


145

Una QueryString è, per definizione , nell'URL. Puoi accedere all'URL della richiesta utilizzando req.URL( doc ). L'oggetto URL ha un Query()metodo ( doc ) che restituisce un Valuestipo, che è semplicemente uno map[string][]stringdei parametri QueryString.

Se quello che stai cercando sono i dati POST inviati da un modulo HTML , questa è (di solito) una coppia chiave-valore nel corpo della richiesta. Hai ragione nella tua risposta che puoi chiamare ParseForm()e quindi utilizzare req.Formfield per ottenere la mappa delle coppie chiave-valore, ma puoi anche chiamare FormValue(key)per ottenere il valore di una chiave specifica. Chiama ParseForm()se richiesto e ottiene i valori indipendentemente da come sono stati inviati (cioè nella stringa della query o nel corpo della richiesta).


2
Grazie per la precisione.
Fabien

2
Trovo il metodo 'req.FormValue (key)' più veloce e faccio per te tutto il codice necessario per pre-analizzare l'URL.
OnlyAngel

6
req.URL.RawQueryrestituisce tutto dopo il ?su una richiesta GET, se questo aiuta.
kouton

Ho trovato interessante req.Form è un array vuoto a meno che req.formValue ("some_field") non venga invocato una volta.
Qian Chen

Grazie mille! @kouton
Aditya Varma,

127

Ecco un esempio più concreto di come accedere ai parametri GET. L' Requestoggetto ha un metodo che li analizza per te chiamato Query :

Supponendo un URL di richiesta come 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=&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
  }    
}

Si noti inoltre che "le chiavi in ​​una mappa dei valori [cioè il valore restituito da Query ()] fanno distinzione tra maiuscole e minuscole."


4
Una risposta precedente già menzionata e collegata ai documenti di fare proprio questo (e non ha un esempio che andrà nel panico con un riferimento a una sezione fuori limite se il campo desiderato non è presente, utilizzare r.URL.Query().Get("moviename")per evitare questo errore fatale).
Dave C

1
Grazie per le informazioni. Sì, i documenti sono un po 'confusi per me, quindi l'ho postato più come un "esempio pratico" nel caso fosse utile. Corretto il controllo dello zero. L'uso del Getmetodo restituisce solo il primo se ce ne sono più, quindi questo è un esempio di più. Informazioni utili, grazie!
rogerdpack

Inoltre non penso che tu possa confrontare una stringa con zero: devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang cioè stringa! = "" È valido
James Milner

Non penso che il codice si compilerebbe, se l'esempio fosse completo. Non puoi confrontare la stringa vuota che Values.Get()restituisce con nil. golang.org/pkg/net/url/#Values
Daniel Farrell

19

Di seguito è riportato un esempio:

value := r.FormValue("field")

per maggiori informazioni. riguardo al pacchetto http, puoi visitare la sua documentazione qui . FormValuefondamentalmente restituisce i valori POST o PUT, o GET, in quest'ordine, il primo che trova.


8

Ecco un semplice esempio funzionante:

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

inserisci qui la descrizione dell'immagine



5

Di seguito le parole provengono dal documento ufficiale.

Il modulo contiene i dati del modulo analizzati, inclusi i parametri di query del campo URL e i dati del modulo POST o PUT . Questo campo è disponibile solo dopo la chiamata a ParseForm.

Quindi, i codici di esempio come di seguito funzionerebbero.

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
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.