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 Values
tipo, che è semplicemente uno map[string][]string
dei 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.Form
field 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.RawQuery
restituisce tutto dopo il ?
su una richiesta GET, se questo aiuta.
Ecco un esempio più concreto di come accedere ai parametri GET. L' Request
oggetto 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).
Get
metodo 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 . FormValue
fondamentalmente 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=foobar
non funzionerà). È necessario inviarlo tramite query params (curl 0.0.0.0:8888?id=foobar
).