Respostas:
Um QueryString está, por definição , no URL. Você pode acessar a URL da solicitação usando req.URL
( doc ). O objeto URL possui um Query()
método ( doc ) que retorna um Values
tipo, que é simplesmente um map[string][]string
dos parâmetros QueryString.
Se o que você está procurando são os dados POST enviados por um formulário HTML , então este é (geralmente) um par de valores-chave no corpo da solicitação. Você está correto em sua resposta que pode chamar ParseForm()
e usar o req.Form
campo para obter o mapa de pares de valores-chave, mas também pode chamar FormValue(key)
para obter o valor de uma chave específica. Isso chama ParseForm()
se necessário e obtém os valores independentemente de como foram enviados (ou seja, na string de consulta ou no corpo da solicitação).
req.URL.RawQuery
retorna tudo após ?
em uma solicitação GET, se isso ajudar.
Aqui está um exemplo mais concreto de como acessar os parâmetros GET. O Request
objeto tem um método que os analisa para você, chamado Query :
Presumindo um URL de solicitação como 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
}
}
Observe também que "as chaves em um mapa Values [isto é, valor de retorno Query ()] diferenciam maiúsculas de minúsculas."
r.URL.Query().Get("moviename")
para evitar esse erro fatal).
Get
método só retorna o primeiro se houver vários, então este é um exemplo de mais. Informação útil, obrigado!
Values.Get()
retorna com nil
. golang.org/pkg/net/url/#Values
Abaixo está um exemplo:
value := r.FormValue("field")
para mais informações. sobre o pacote http, você pode visitar sua documentação aqui . FormValue
basicamente retorna valores POST ou PUT, ou valores GET, nessa ordem, o primeiro que encontrar.
Aqui está um exemplo simples e 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)
}
Existem duas maneiras de obter parâmetros de consulta:
No segundo caso, deve-se ter cuidado, pois os parâmetros do corpo terão precedência sobre os parâmetros de consulta. Uma descrição completa sobre como obter parâmetros de consulta pode ser encontrada aqui
https://golangbyexample.com/net-http-package-get-query-params-golang
As palavras abaixo vêm do documento oficial.
O formulário contém os dados do formulário analisados, incluindo os parâmetros de consulta do campo URL e os dados do formulário POST ou PUT . Este campo só está disponível após a chamada de ParseForm.
Portanto, os códigos de amostra abaixo funcionariam.
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")
buscar um parâmetro de consulta, não poderá enviar i por meio de dados de formulário em cURL (ou seja,curl 0.0.0.0:8888 -d id=foobar
não funcionará). Você deve enviá-lo através de parâmetros de consulta (curl 0.0.0.0:8888?id=foobar
).