Risposte:
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).
req.URL.RawQueryrestituisce tutto dopo il ?su una richiesta GET, se questo aiuta.
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=¶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
}
}
Si noti inoltre che "le chiavi in una mappa dei valori [cioè il valore restituito da Query ()] fanno distinzione tra maiuscole e minuscole."
r.URL.Query().Get("moviename")per evitare questo errore fatale).
Getmetodo restituisce solo il primo se ce ne sono più, quindi questo è un esempio di più. Informazioni utili, grazie!
Values.Get()restituisce con nil. golang.org/pkg/net/url/#Values
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.
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)
}
Esistono due modi per ottenere i parametri della query:
Nel secondo caso bisogna stare attenti poiché i parametri del corpo avranno la precedenza sui parametri della query. Una descrizione completa su come ottenere i parametri della query può essere trovata qui
https://golangbyexample.com/net-http-package-get-query-params-golang
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
}
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).