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>}