去 gin 获取请求正文 json

Ben*_*Odr 8 http-post go

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

请求正文

{
    "order":"1",
    "Name":"ts1"
}
Run Code Online (Sandbox Code Playgroud)

我需要将数据传输到 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)
            }

        }
Run Code Online (Sandbox Code Playgroud)

f 不是 json 并且我收到错误,知道如何使其工作吗?错误是:

redis: can't marshal map[string]interface {} (implement encoding.BinaryMarshaler)
Run Code Online (Sandbox Code Playgroud)

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

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

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

client.Set("id", json, 0).Err()
Run Code Online (Sandbox Code Playgroud)

Ali*_*our 31

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

{ email: "test@test.com" }
Run Code Online (Sandbox Code Playgroud)

现在您想在后端获取此电子邮件。首先,定义一个如下所示的结构体:

    type EmailRequestBody struct {
    Email string
    }
Run Code Online (Sandbox Code Playgroud)

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

func ExampleFunction(c *gin.Context) {

var requestBody EmailRequestBody

   if err := c.BindJSON(&requestBody); err != nil {
       // DO SOMETHING WITH THE ERROR
   }

  fmt.Println(requestBody.Email)
}
Run Code Online (Sandbox Code Playgroud)

您可以轻松访问电子邮件值并将其打印出来或执行您需要的任何操作:

fmt.Println(requestBody.Email)
Run Code Online (Sandbox Code Playgroud)


小智 12

或者您可以将GetRawData()函数用作:

jsonData, err := c.GetRawData()

if err != nil{
   //Handle Error
}

err = client.Set("id", jsonData, 0).Err()
Run Code Online (Sandbox Code Playgroud)


cha*_*ash 11

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

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

  • 从 Go 1.16 开始,应该使用 `io.ReadAll` 而不是 `ioutil.ReadAll` <https://pkg.go.dev/io/ioutil> (5认同)
  • 如果您需要阅读正文两次,这将不起作用。 (4认同)

小智 6

如果你想像express(Nodejs)等其他框架一样获取json body,你可以执行以下操作

bodyAsByteArray, _ := ioutil.ReadAll(c.Request.Body)
jsonBody := string(bodyAsByteArray)
Run Code Online (Sandbox Code Playgroud)

  • 确保处理 ioutil.ReadAll 的错误。应避免使用下划线,因为 bodyAsByteArray 可能为零。服务器可能会出现恐慌。 (2认同)