从 Go 中的请求正文检索 JSON
处理包含 JSON 内容的 POST 请求时,有必要提取 JSON 数据来自请求的正文。然而,对于从 Node.js 等语言迁移代码的 Go 初学者来说,这可能是一项令人困惑的任务。
为了解决这个问题,已经尝试了几种方法:
var v 接口{}<br>err := json.NewDecoder(context.Request().Body).Decode(&v)<br>if err != nil {<pre class="brush:php;toolbar:false">return result, err
}
fmt .Println(v)
在这个例子中,结果通常是空的,表明正文是空的。这是因为 http.Request.Body 是一个缓冲区,一旦从中读取数据,就无法再次读取。
另一种方法是:
m := echo .Map{}<br>if err := context.Bind(&m); err != nil {<pre class="brush:php;toolbar:false">return result, err
}
fmt.Println(m)
这里,代码会产生错误消息“EOF ”。出现此错误的原因是请求中没有 content-type header,因此 Echo 无法确定发送的数据类型。
最后尝试直接读取正文:
body, error := ioutil.ReadAll(context.Request().Body)
if error != nil {
return result, error
}
fmt.Println(body)
结果是一个空的字节数组,因为 ioutil.ReadAll() 消耗了请求正文。
解决方案在于理解 http.Request.Body 的本质:缓冲区并找到读取后恢复它的方法。以下代码片段提供了解决方法:
// 读取正文内容<br>var bodyBytes []byte<br>if context.Request().Body != nil { <pre class="brush:php;toolbar:false">bodyBytes, _ = ioutil.ReadAll(context.Request().Body)
}
// 将 io.ReadCloser 恢复到原始状态
context.Request().Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
// 继续使用 Body,就像将其绑定到结构体一样:
order := new(models.GeaOrder)
error := context.Bind(order)
通过此解决方法,现在可以读取正文、保留其内容以供以后使用,并将其数据成功绑定到结构。
以上是如何从 Go 中的请求正文中检索 JSON 数据?的详细内容。更多信息请关注PHP中文网其他相关文章!