Go   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了gin / golang – 空的Req Body大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我是Go和Gin的新手,我在打印完整的请求主体时遇到了麻烦.

我希望能够从第三方POST读取请求正文,但我得到空请求正文

curl -u dumbuser:dumbuserpassword -H "Content-Type: application/json" -X POST --data '{"events": "3"}' http://localhost:8080/events

我的整个代码如下.任何指针都很赞赏!

package main

import (
  "net/http"
  "fmt"
  "github.com/gin-gonic/gin"
)

func main() {
  router := gin.Default()
  authorized := router.Group("/",gin.basicAuth(gin.Accounts{
     "dumbuser": "dumbuserpassword",}))
  authorized.POST("/events",events)
  router.Run(":8080")
}

func events(c *gin.Context) {
  fmt.Printf("%s",c.request.body)
  c.JSON(http.StatusOK,C)
}
这里的问题是你打印出c.request.body的字符串值,它是接口类型ReadCloser.

您可以做些什么来确保它实际上包含您想要的主体是将c.request.body中的值读取到字符串,然后将其打印出来.这仅适用于您的学习过程!

学习代码

func events(c *gin.Context) {
        x,_ := IoUtil.ReadAll(c.request.body)
        fmt.Printf("%s",String(X))
        c.JSON(http.StatusOK,C)
}

但是,这不是您应该访问请求正文的方式.让杜松子酒通过使用绑定为您解析身体.

更正确的代码

type E struct {
        Events String
}

func events(c *gin.Context) {
        data := &E{}
        c.bind(data)
        fmt.Println(data)
        c.JSON(http.StatusOK,C)
}

这是一种更正确的方式来访问正文中的数据,因为它已经为您解析了.请注意,如果您首先阅读身体,就像我们在学习步骤中所做的那样,c.request.body将被清空,因此身体中没有任何东西可供Gin阅读.

破码:

func events(c *gin.Context) {
    x,_ := IoUtil.ReadAll(c.request.body)
    fmt.Printf("%s",String(X))
    data := &E{}
    c.bind(data) // data is left unchanged because c.request.body has been used up.
    fmt.Println(data)
    c.JSON(http.StatusOK,C)
}

您可能也很好奇为什么从此端点返回的JSON显示并清空request.body.出于同样的原因. JSON编组方法无法序列化ReadCloser,因此它显示为空.

大佬总结

以上是大佬教程为你收集整理的gin / golang – 空的Req Body全部内容,希望文章能够帮你解决gin / golang – 空的Req Body所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。