一尘不染

在 Go 的 http 包中,如何获取 POST 请求的查询字符串?

go

我正在使用httpGo 中的包来处理 POST 请求。如何从Request对象访问和解析查询字符串的内容?我无法从官方文档中找到答案。


阅读 169

收藏
2021-11-15

共2个答案

一尘不染

根据定义,QueryString位于 URL 中。您可以使用doc访问请求的 URL 。URL 对象有一个Query()方法 ( doc,它返回一个Values类型,它只是map[string][]stringQueryString 参数的一个。

如果您要查找的是由 HTML 表单提交的 POST 数据,那么这(通常)是请求正文中的键值对。您的答案是正确的,您可以调用ParseForm()然后使用req.Formfield 来获取键值对的映射,但是您也可以调用FormValue(key)来获取特定键的值。ParseForm()如果需要,它会调用,并获取值而不管它们是如何发送的(即在查询字符串中或在请求正文中)。

2021-11-15
一尘不染

下面是一个更具体的示例,说明如何访问 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=&param2= param1 will also be "" :|
  }

  // if multiples possible, or to process empty values like param1 in
  // ?param1=&param2=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() 返回值] 区分大小写。”

2021-11-15