首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gin/golang -空请求正文

gin/golang -空请求正文
EN

Stack Overflow用户
提问于 2015-08-10 12:20:06
回答 1查看 13.9K关注 0票数 9

我是Go和Gin的新手,在打印完整的请求正文时遇到了问题。

我希望能够从第三方帖子中读取请求正文,但我得到的请求正文是空的

代码语言:javascript
复制
curl -u dumbuser:dumbuserpassword -H "Content-Type: application/json" -X POST --data '{"events": "3"}' http://localhost:8080/events

我的整个代码如下所示。任何指针都很受欢迎!

代码语言:javascript
复制
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)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-10 13:35:14

这里的问题是,您打印的是接口类型为ReadCloserc.Request.Body的字符串值。

要使自己确信它确实包含所需的主体,您可以做的是将c.Request.Body中的值读出为字符串,然后将其打印出来。这仅供您的学习过程使用!

学习代码:

代码语言:javascript
复制
func events(c *gin.Context) {
        x, _ := ioutil.ReadAll(c.Request.Body)
        fmt.Printf("%s", string(x))
        c.JSON(http.StatusOK, c)
}

但是,这不是访问请求正文的方式。通过使用绑定,让gin为您解析正文。

更正确的代码:

代码语言:javascript
复制
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读取。

损坏的代码:

代码语言:javascript
复制
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,因此它显示为空。

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31911579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档