首页 >后端开发 >Golang >如何从 Go 中的请求正文中检索 JSON 数据?

如何从 Go 中的请求正文中检索 JSON 数据?

Linda Hamilton
Linda Hamilton原创
2024-10-31 10:34:06526浏览

How to Retrieve JSON Data from a Request Body in Go?

从 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn