我的处理程序中可能出错了什么?
type Patient struct {
FirstName string
LastName string
}
func createHandler(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
p := new(Patient)
err := json.NewDecoder(r.Body).Decode(&p)
if err != nil && err != io.EOF {
log.Fatal(err)
}
log.Print(p)
}
我总是来自curl -X POST $PATH -d '{"firstName": "Julian"}'
2016/01/23 17:33:50 &{ }
我已添加fmt.Println(r)
并获得此
2016/01/23 18:33:22 &{POST /patients/ HTTP/1.1 1 1 map[Accept:[*/*] Content-Type:[application/json] User-Agent:[curl/7.46.0]] 0x9b2820 0 [] false localhost:8081 map[] map[] <nil> map[] [::1]:35394 /patients/ <nil> <nil>}
调试上一行后,我发现它是gorilla toolkit子路由器的问题
答案 0 :(得分:1)
两件事:
由于您使用的是JSON lib约定,因此您的帖子表单数据应为FirstName
而不是firstName
。如果您真的想使用firstName
,则需要将此结构标记添加到字段:json:"firstName"
。
接下来,您不再需要将&
放入&p
,因为new(Patient)
已经返回指针。只需添加p
。
虽然就个人而言,我只是做p := Patient{}
,所以我知道它不是指针并且在解码器中使用&p
。
答案 1 :(得分:0)
您必须删除r.ParseForm
。你可以在这里阅读
https://golang.org/pkg/net/http/#Request.ParseForm
对于POST或PUT请求,它还会解析请求正文
因此,在调用ParseForm
之后,您的请求正文将为空,您将收到一个空结构。