我正在使用Go的http
包来处理POST请求。如何从Request
对象访问和解析查询字符串的内容?我无法从官方文档中找到答案。
答案 0 :(得分:124)
URL中的QueryString是by definition。您可以使用req.URL
(doc)访问请求的网址。 URL对象具有Query()
方法(doc),该方法返回Values
类型,它只是QueryString参数的map[string][]string
。
如果您要查找的是POST数据as submitted by an HTML form,那么这通常是请求正文中的键值对。您的答案是正确的,您可以拨打ParseForm()
,然后使用req.Form
字段获取键值对的地图,但您也可以调用FormValue(key)
来获取值一个特定的钥匙。如果需要,这会调用ParseForm()
,并获取值,无论它们是如何发送的(即在查询字符串中或在请求正文中)。
答案 1 :(得分:90)
以下是如何访问GET参数的更具体示例。 Request
对象有一个方法可以为您解析它们Query:
假设请求网址为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
}
}
另请注意“值映射中的键[即Query()返回值]区分大小写。”
答案 2 :(得分:11)
以下是一个例子:
value := r.FormValue("field")
了解更多信息。关于http包,您可以访问其文档here。 FormValue
基本上按顺序返回POST或PUT值或GET值,即它找到的第一个值。
答案 3 :(得分:5)
这是一个简单的工作示例:
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)
}
答案 4 :(得分:4)
以下文字来自官方文件。
表单包含已解析的表单数据,包括 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
}
答案 5 :(得分:2)
有两种获取查询参数的方法:
在第二种情况下,必须小心,因为主体参数将优先于查询参数。可以在此处找到有关获取查询参数的完整说明
https://golangbyexample.com/net-http-package-get-query-params-golang