Go语言 去吧,杜松子酒,去拿请求的身体,杰森

0ejtzxu1  于 2023-01-28  发布在  Go
关注(0)|答案(4)|浏览(212)

我使用 Postman 后的数据和在体内我把一些简单的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)

我使用www.example.comhttps://github.com/go-redis/redis#quickstart
如果我删除主体并使用像这样的硬编码代码,我就可以设置数据,它可以工作

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

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

s6fujrry1#

如果你只想把请求体JSON作为一个值传递给Redis,那么你不需要把JSON绑定到一个值上,直接从请求体中读取原始的JSON,然后把它传递给Redis:

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

iqxoj9l92#

让我们举一个例子,假设你的请求正文有一个用户邮箱,如下所示:

{ email: "test@test.com" }

现在你想在后端得到这封邮件。首先,定义一个如下的结构:

type EmailRequestBody struct {
    Email string
    }

现在,您可以轻松地将请求正文中的email值绑定到您定义的结构体:首先,为你的结构体定义一个变量,然后绑定它的值:

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)
mpgws1up

mpgws1up3#

也可以使用GetRawData()函数:

jsonData, err := c.GetRawData()

if err != nil{
   //Handle Error
}

err = client.Set("id", jsonData, 0).Err()
kiayqfof

kiayqfof4#

如果你想得到像express(Nodejs)这样的json主体,你可以做以下事情

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

相关问题