当使用这样的代码从 post 请求的正文中解码 json 时,出现解码错误。此外,从错误的文本来看,错误不在这个方法中,而在 h(w, r) 方法后面的 graphql 处理程序中。
func middlewareAuth(h http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var requestBody requestBody
bytebody, err := ioutil.ReadAll(r.Body)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
http.Error(w, "{\"errors\":[{\"message\":\"Request decode error!.\"}],\"data\":null}", 400)
return
}
replaceChars := strings.NewReplacer("\n", "", "\r", "")
strbody := replaceChars.Replace(string(bytebody))
if len(strbody) > 0 {
err := json.Unmarshal([]byte(strbody), &requestBody)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
http.Error(w, "{\"errors\":[{\"message\":\"Request decode error! please check your JSON formating. custom\"}],\"data\":null}", 400)
return
}
}
h(w, r)
}
}
graphql 抛出错误:
{
"error": {
"errors": [
{
"message": "json body could not be decoded: EOF"
}
],
"data": null
}
}
但是如果你在一个字符串中处理任意json,那么就没有错误:
func middlewareAuth(h http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var requestBody requestBody
var strbody string
strbody = "{\"query\":\"custom\", \"token\":\"l7k8\"}"
if len(strbody) > 0 {
err := json.Unmarshal([]byte(strbody), &requestBody)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
http.Error(w, "{\"errors\":[{\"message\":\"Request decode error! please check your JSON formating. custom\"}],\"data\":null}", 400)
return
}
}
h(w, r)
}
}
我不明白为什么会发生错误,我没有修改请求
帮助修复错误
r.Body 只能读取一次。你用代码做
ioutil.ReadAll(r.Body)
之后,如果你再读一遍,你会得到一个错误。因此,您需要读取和回写相同的内容。