Câu trả lời:
Theo định nghĩa , chuỗi truy vấn nằm trong URL. Bạn có thể truy cập URL của yêu cầu bằng req.URL
( doc ). Đối tượng URL có một Query()
phương thức ( doc ) trả về một Values
kiểu, đơn giản là một map[string][]string
trong các tham số QueryString.
Nếu những gì bạn đang tìm kiếm là dữ liệu ĐĂNG như được gửi bởi biểu mẫu HTML , thì đây (thường) là một cặp khóa-giá trị trong nội dung yêu cầu. Bạn đã trả lời đúng trong câu trả lời của mình rằng bạn có thể gọi ParseForm()
và sau đó sử dụng req.Form
trường để nhận bản đồ của các cặp khóa-giá trị, nhưng bạn cũng có thể gọi FormValue(key)
để nhận giá trị của một khóa cụ thể. Điều này gọi ParseForm()
nếu được yêu cầu và nhận các giá trị bất kể chúng được gửi như thế nào (tức là trong chuỗi truy vấn hoặc trong phần thân yêu cầu).
req.URL.RawQuery
trả về mọi thứ sau ?
yêu cầu GET, nếu điều đó hữu ích.
Đây là một ví dụ cụ thể hơn về cách truy cập các tham số GET. Đối Request
tượng có một phương thức phân tích cú pháp chúng ra cho bạn được gọi là Truy vấn :
Giả sử một URL yêu cầu như 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
}
}
Cũng lưu ý "các khóa trong bản đồ Giá trị [tức là Giá trị trả về của Truy vấn ()] phân biệt chữ hoa chữ thường."
r.URL.Query().Get("moviename")
để tránh sai lầm nghiêm trọng này).
Get
phương thức này chỉ trả về giá trị đầu tiên nếu có nhiều, vì vậy đây là một ví dụ về nhiều. Thông tin hữu ích, cảm ơn bạn!
Values.Get()
trả về với nil
. golang.org/pkg/net/url/#Values
Dưới đây là một ví dụ:
value := r.FormValue("field")
để biết thêm thông tin. về gói http, bạn có thể truy cập tài liệu của nó tại đây . FormValue
về cơ bản trả về giá trị POST hoặc PUT hoặc giá trị GET, theo thứ tự đó, giá trị đầu tiên nó tìm thấy.
Đây là một ví dụ đơn giản, hoạt động:
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)
}
Có hai cách để nhận tham số truy vấn:
Trong trường hợp thứ hai, người ta phải cẩn thận vì các tham số body sẽ được ưu tiên hơn các tham số truy vấn. Bạn có thể tìm thấy mô tả đầy đủ về việc nhận các tham số truy vấn tại đây
https://golangbyexample.com/net-http-package-get-query-params-golang
Các từ dưới đây đến từ tài liệu chính thức.
Biểu mẫu chứa dữ liệu biểu mẫu được phân tích cú pháp, bao gồm cả tham số truy vấn của trường URL và dữ liệu biểu mẫu POST hoặc PUT . Trường này chỉ khả dụng sau khi ParseForm được gọi.
Vì vậy, các mã mẫu như bên dưới sẽ hoạt động.
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")
để tìm nạp một tham số truy vấn, bạn không thể gửi tôi qua dữ liệu biểu mẫu trong cURL (tức làcurl 0.0.0.0:8888 -d id=foobar
sẽ không hoạt động). Bạn phải gửi nó qua truy vấn params (curl 0.0.0.0:8888?id=foobar
).