【问题标题】:Request Form is returning nil请求表单返回 nil
【发布时间】:2019-06-27 16:18:28
【问题描述】:

我正在学习 golang,并尝试实现自定义组合以熟悉该语言,不幸的是 req.Form 正在返回 nil

当然我在req.ParseForm()之前跑。

func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) {
    req.ParseForm()
    params := req.Form
    node, _ := r.tree.findNode(strings.Split(req.URL.Path, "/")[1:], params)
    if handler := node.methods[req.Method]; handler != nil {
        handler(w, req, params)
    }
}

这是我通过GET http://localhost:8080/users/3使用的示例网址

【问题讨论】:

  • GET 请求不包含正文,您是否尝试从 URL 获取参数?
  • 你有没有试过检查func (r *Request) ParseForm() error返回的错误?
  • @Зелёный 好吧,当使用 ?a=b 作为查询时,req.Form 仍然有可能解析内容

标签: go url mux


【解决方案1】:

根据文档,如果您致电 req.ParseForm,则应始终更新 req.Form

对于所有请求,ParseForm 从 URL 解析原始查询并更新 r.Form。

而且,如果你看一下 ParseForm 的实现,在方法执行后似乎不可能是nil

https://github.com/golang/go/blob/master/src/net/http/request.go#L1238

确实可能发生的是req.Form 最终成为一张空地图,也许这就是您在那里看到的。

如果你这样做,它为空是有意义的:

GET http://localhost:8080/users/3

由于 ParseForm 没有实际解析的参数,所以 req.Form 最终将是一个空映射。

例如,如果您尝试这样做:

GET http://localhost:8080/users/3?a=b

然后你应该在映射中获得一个条目,其中"a" 作为键,["b"] 作为值。

【讨论】:

  • 谢谢!:) 所以我必须解析它以获取用户的 id 吗?
  • @BilalReffas,对,看这里:stackoverflow.com/questions/34314975/… 或者有很多库可以让这变得更容易
  • 谢谢!那就自己建吧:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 2012-01-12
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多