Відповіді:
QueryString є, за визначенням , у URL-адресі. Ви можете отримати доступ до URL-адреси запиту, використовуючи req.URL( doc ). Об'єкт URL має Query()метод ( doc ), який повертає Valuesтип, який є просто map[string][]stringпараметром QueryString.
Якщо ви шукаєте дані POST , подані у формі HTML , то це (як правило) пара ключових значень в тілі запиту. Ви правильно сказали, що можете зателефонувати, ParseForm()а потім використати req.Formполе, щоб отримати карту пар ключових значень, але ви також можете зателефонувати, FormValue(key)щоб отримати значення конкретного ключа. Це вимагає дзвінка, ParseForm()якщо потрібно, і отримує значення незалежно від того, як вони були надіслані (тобто в рядку запиту або в тілі запиту).
req.URL.RawQueryповертає все після ?запиту GET, якщо це допомагає.
Ось більш конкретний приклад доступу до параметрів GET. RequestОб'єкт має метод , який аналізує їх для вас називається Query :
Якщо припустити URL-адресу запиту, як 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
}
}
Також зауважте, що "ключі на карті значень [тобто значення повернення запиту ()] залежать від регістру".
r.URL.Query().Get("moviename")щоб уникнути цієї фатальної помилки).
Getметоду повертає перше, лише якщо їх декілька, тому це приклад більше. Корисна інформація, дякую!
Values.Get()повертається nil. golang.org/pkg/net/url/#Values
Нижче наведено приклад:
value := r.FormValue("field")
для отримання додаткової інформації. про пакунок http, ви можете відвідати його документацію тут . FormValueв основному повертає значення POST або PUT, або GET, у тому порядку, перший, який він знайде.
Ось простий, робочий приклад:
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)
}
Існує два способи отримання параметрів запитів:
У другому випадку потрібно бути обережним, оскільки параметри тіла матимуть перевагу над параметрами запиту. Повний опис отримання параметрів запитів можна знайти тут
https://golangbyexample.com/net-http-package-get-query-params-golang
Нижче слова походять з офіційного документа.
Форма містить проаналізовані дані форми, включаючи як параметри запиту поля URL, так і дані форми POST або PUT . Це поле доступне лише після виклику ParseForm.
Отже, зразкові коди, як показано нижче, спрацювали б.
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")для отримання парам-запиту, ви не можете надсилати i через дані форми в cURL (тобтоcurl 0.0.0.0:8888 -d id=foobarне працюватимуть). Ви повинні надіслати його через параметри запитів (curl 0.0.0.0:8888?id=foobar).