【问题标题】:Go gin get request body jsonGo gin 获取请求正文 json
【发布时间】:2020-05-20 18:02:02
【问题描述】:

我使用邮递员发布数据并在正文中放入一些简单的 json

请求正文

{
    "order":"1",
    "Name":"ts1"
}

我需要将数据传输到 json 并尝试如下, 而且我无法获得 json,不知道缺少什么

router.POST("/user", func(c *gin.Context) {
        var f interface{}
        //value, _ := c.Request.GetBody()
        //fmt.Print(value)

        err2 := c.ShouldBindJSON(&f)
        if err2 == nil {
            err = client.Set("id", f, 0).Err()
            if err != nil {
                panic(err)
            }

        }

f 不是 json 并且我得到一个错误,知道如何使它工作吗? 错误是:

redis: can't marshal map[string]interface {} (implement encoding.BinaryMarshaler)

我用https://github.com/go-redis/redis#quickstart

如果我删除正文并使用这样的硬编码代码,我可以设置数据,它可以工作

json, err := json.Marshal(Orders{
    order:   "1",
    Name: "tst",
})

client.Set("id", json, 0).Err()

【问题讨论】:

  • 您遇到的错误是什么?
  • 错误是什么? “f 不是 json”是什么意思?
  • @CeriseLimón - 请查看我的更新
  • @hmm - 请看我的更新
  • 看起来您的目标是将发布的 JSON 文档存储到 Redis。如果是这样,则将 body 放入 []byte 并将 []byte 存储在 Redis 中。不要将 JSON 解码为 Go 值。

标签: go http-post


【解决方案1】:

如果只想将请求体 JSON 作为值传递给 Redis,则不需要将 JSON 绑定到值。直接从请求正文中读取原始 JSON 并将其传递:

jsonData, err := ioutil.ReadAll(c.Request.Body)
if err != nil {
    // Handle error
}
err = client.Set("id", jsonData, 0).Err()

【讨论】:

    【解决方案2】:

    或者你可以使用GetRawData()函数作为:

    jsonData, err := c.GetRawData()
    
    if err != nil{
       //Handle Error
    }
    
    err = client.Set("id", jsonData, 0).Err()
    

    【讨论】:

      【解决方案3】:

      让我们举个例子。假设您的请求正文有这样的用户电子邮件:

      { email: "test@test.com" }
      

      现在您想在 bakend 上收到这封电子邮件。首先定义如下结构:

          type EmailRequestBody struct {
          Email string
          }
      

      现在您可以轻松地将请求正文中的电子邮件值绑定到您定义的结构,如下所示:首先为您的结构定义一个变量,如下所示,然后绑定该值:

      func ExampleFunction(c *gin.Context) {
      
      var requestBody EmailRequestBody
      
         if err := c.BindJSON(&requestBody); err != nil {
             // DO SOMETHING WITH THE ERROR
         }
      
        fmt.Println(requestBody.Email)
      }
      

      您可以轻松访问电子邮件值并将其打印出来或做任何您需要的事情:

      fmt.Println(requestBody.Email)
      

      【讨论】:

        【解决方案4】:

        如果你想像express(Nodejs)这样的其他框架一样获取json body,你可以这样做

        bodyAsByteArray, _ := ioutil.ReadAll(c.Request.Body)
        jsonBody := string(bodyAsByteArray)
        

        【讨论】:

          猜你喜欢
          • 2020-10-25
          • 1970-01-01
          • 2017-07-04
          • 2018-04-21
          • 1970-01-01
          • 2021-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多