从HTTP请求解码JSON时遇到EOF错误

5
我一直收到EOF错误,不确定原因。我已经使用打印语句进行了检查,该方法为POST,并且内容类型应该是application/json。我期望的json格式如下:{"path":"example/path/to"} 代码成功运行,但输出一个错误,这也很奇怪,因为在出现错误时它应该在完成函数的其余部分之前返回。
func create(w http.ResponseWriter, r *http.Request) {   
     dump, er := httputil.DumpRequest(r, true)
     if er != nil {
         http.Error(w, fmt.Sprint(er), http.StatusInternalServerError)
         return
     }
     fmt.Println(string(dump)) 

     var req map[string]string
     decoder := json.NewDecoder(r.Body)
     err := decoder.Decode(&req)
     if err != nil {
         fmt.Println(err)
         return
     }
     fmt.Println(req["path"])
 
     err = os.MkdirAll("/"+req["path"], os.ModePerm)
     if err != nil {
         fmt.Println(err)
         return
     }
}

它只打印出"Bob"和"EOF",我进行了广泛的谷歌搜索,但我真的找不到其他地方回答这个问题。我也尝试使用r.ParseForm和r.FormValue以及PostFormValue,但是当我这样做时,字符串为空。
此外,如果有用的话,这是值的前端代码。
fetch(url, {
  method: "POST",
  headers: {
    "Content-Type": "application/json"
  },
  body: JSON.stringify({ "path": "example/path/to" })
})

编辑:这是我的DumpRequest

Listening on :5000
OPTIONS /api/create HTTP/1.1
Host: localhost:5000
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Access-Control-Request-Headers: content-type
Access-Control-Request-Method: POST
Connection: keep-alive
Origin: http://localhost:3000
Referer: http://localhost:3000/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site

EOF
POST /api/create HTTP/1.1
Host: localhost:5000
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Connection: keep-alive
Content-Length: 47
Content-Type: application/json
Origin: http://localhost:3000
Referer: http://localhost:3000/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
{"path":"/Users/paul/Desktop/temp/new/hi 2/hi"}

我感到困惑的是EOF错误出现在DumpRequest消息之间。

2
如果 http.Request.Body 是空的,那么 ReadCloser 会立即返回 EOF。尝试将其转储以确保它确实填充了您所期望的内容。 - Marc
@Marc,"dumping it" 是什么意思?是像打印 r.Body 一样吗? - Paul Jones
4
这句话的意思是读取身体并将其打印出来。在尝试解析它之前,你应该确保你收到了你实际期望的内容。 - Marc
1
使用httputil.DumpRequest来检查请求。 - Peter
@BhupinderSinghNarang 我已经按照你在 JavaScript 代码中所述进行了更改,但在服务器代码上仍然存在相同的 EOF 问题。 - Paul Jones
显示剩余2条评论
1个回答

4

看起来问题在于我的前端调用了两次终点,这就是为什么出现EOF错误的原因。我将所有的代码都包装在了

if r.Method == "POST" {
 ...
}

问题已经得到解决。
我认为多余的端点访问是CORS预检测或类似的东西。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接