Respuestas:
Un QueryString está, por definición , en la URL. Puede acceder a la URL de la solicitud utilizando req.URL
( doc ). El objeto URL tiene un Query()
método ( doc ) que devuelve un Values
tipo, que es simplemente uno map[string][]string
de los parámetros de QueryString.
Si lo que está buscando son los datos POST enviados por un formulario HTML , entonces este es (generalmente) un par clave-valor en el cuerpo de la solicitud. Tiene razón en su respuesta que puede llamar ParseForm()
y luego usar el req.Form
campo para obtener el mapa de pares clave-valor, pero también puede llamar FormValue(key)
para obtener el valor de una clave específica. Esto llama ParseForm()
si es necesario y obtiene valores independientemente de cómo se enviaron (es decir, en la cadena de consulta o en el cuerpo de la solicitud).
req.URL.RawQuery
devuelve todo después ?
de una solicitud GET, si eso ayuda.
Aquí hay un ejemplo más concreto de cómo acceder a los parámetros GET. El Request
objeto tiene un método que los analiza por usted llamado Consulta :
Suponiendo una URL de solicitud como http: // host: puerto / algo? 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
}
}
También tenga en cuenta que "las claves en un mapa de valores [es decir, el valor de retorno de Query ()] distinguen entre mayúsculas y minúsculas".
r.URL.Query().Get("moviename")
para evitar este error fatal).
Get
método solo devuelve el primero si hay varios, por lo que este es un ejemplo de más. Información útil, ¡gracias!
Values.Get()
regresa con nil
. golang.org/pkg/net/url/#Values
A continuación se muestra un ejemplo:
value := r.FormValue("field")
para más información. acerca del paquete http, puede visitar su documentación aquí . FormValue
básicamente devuelve valores POST o PUT, o valores GET, en ese orden, el primero que encuentra.
Aquí hay un ejemplo simple y funcional:
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)
}
Hay dos formas de obtener parámetros de consulta:
En el segundo caso, hay que tener cuidado ya que los parámetros del cuerpo tendrán prioridad sobre los parámetros de consulta. Puede encontrar una descripción completa sobre cómo obtener parámetros de consulta aquí
https://golangbyexample.com/net-http-package-get-query-params-golang
A continuación, las palabras provienen del documento oficial.
El formulario contiene los datos del formulario analizados, incluidos los parámetros de consulta del campo URL y los datos del formulario POST o PUT . Este campo solo está disponible después de llamar a ParseForm.
Por lo tanto, los códigos de muestra que se muestran a continuación funcionarían.
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")
para buscar un parámetro de consulta, no puede enviar i a través de los datos del formulario en cURL (es decir,curl 0.0.0.0:8888 -d id=foobar
no funcionará). Debe enviarlo a través de los parámetros de consulta (curl 0.0.0.0:8888?id=foobar
).