Відповіді:
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
).