我是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,因此它显示为空.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。