go struct JSON解码始终为空返回&;{}
在我的处理程序中,我可能做错了什么go struct JSON解码始终为空返回&;{},go,Go,在我的处理程序中,我可能做错了什么 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
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-xpost$PATH-d'{“firstName”:“Julian”}'
编辑
我添加了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>}
2016/01/23 18:33:22&{POST/patients/HTTP/1.1 map[Accept:[*/*]内容类型:[application/json]用户代理:[curl/7.46.0]]0x9B28200[]假本地主机:8081 map[]map[]map[][::1]:35394/patients/}
调试完前一行后,我意识到gorilla toolkit的子计算机有问题您必须删除
r.ParseForm
。你可以在这里阅读
对于POST或PUT请求,它还解析请求体
因此,调用ParseForm
后,您的请求正文将为空,并且您将收到一个空的结构。两件事:
因为您使用的是JSON lib约定,所以post表单数据应该是FirstName
,而不是FirstName
。如果确实想使用firstName
,则需要将此结构标记添加到字段:json:“firstName”
接下来,您不再需要将&
放入&p
中,因为新建(患者)
已经返回指针。只要把p
虽然就我个人而言,我只是做
p:=Patient{}
,这样我就知道它不是指针,并在解码器中使用&p
将内容类型添加到帖子时会发生什么-H“Content Type:application/json”
(您的处理程序正在我的机器上运行,但我使用的是Powershells Invoke RestMethod,因此推测curl命令是否有问题…)我让它在我的windows机器上使用curl,并使用像下面这样的转义字符curl.exe-X POSThttp://localhost:8080 -d“{\”名字\:\”测试值\“}”-H“内容类型:application/json”
不确定您使用的是什么操作系统?(窗户很奇怪…)
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>}