我使用邮递员发布数据并在正文中放入一些简单的 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)
小智 6
如果你想像express(Nodejs)等其他框架一样获取json body,你可以执行以下操作
bodyAsByteArray, _ := ioutil.ReadAll(c.Request.Body)
jsonBody := string(bodyAsByteArray)
Run Code Online (Sandbox Code Playgroud)