我是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
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,因此显示为空。
Request.Body