【问题标题】:BindJSON does not return error when Input is wrongInput错误时BindJSON不返回错误
【发布时间】:2019-12-05 13:38:48
【问题描述】:

以下是我正在尝试的

func TestCreteJob(t *testing.T) {
    requestBody, err := json.Marshal(map[string]string{
        "username": "u1",
        "password": "p1",
    })
    if err != nil {
        t.Errorf("Test Failed ")
    }

    res, err := http.Post("http://127.0.0.1:9090/job", "application/json", bytes.NewBuffer(requestBody))
    if err != nil {
        log.Fatal(err)
    }
    greeting, err := ioutil.ReadAll(res.Body)
    res.Body.Close()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%s", greeting)
}

我的处理程序如下所示

func Handlers() *gin.Engine {
    router := gin.Default()

    // Sample API
    router.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })
    router.POST("/job", func(c *gin.Context) {
        if c.Request.Method == "POST" {
            var u User
            err := c.BindJSON(&u)
            if err != nil {
                c.AbortWithError(http.StatusBadRequest, err)
            }
            c.JSON(http.StatusOK, gin.H{
                "user": u.Username,
                "pass": u.Password,
            })
        }
    })
    return router
}

我已将对象定义为

type User struct {
   Username string `json: abc`
   Password string `json: password`
}

这应该会失败,因为输入没有'abc' 我是不是在这里做错了什么。

【问题讨论】:

标签: go go-gin


【解决方案1】:

你的结构标签对于 json 是错误的

type User struct {
   Username string `json:"abc"`
   Password string `json:"password"`
}

看这里 https://play.golang.org/p/oj_PwLoX5qs

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    fmt.Println("Hello, playground")

    dataz := []byte(`{"abc": "sberry", "password": "hunter2"}`)

    var u User

    err := json.Unmarshal(dataz, &u)
    if err != nil {
        fmt.Println(err.Error())
    }
    fmt.Printf("%+v\n", u)
}

type User struct {
    Username string `json:"abc"`
    Password string `json:"password"`
}

【讨论】:

  • 感谢您的评论。当json如下dataz := []byte({"abc11": "sberry", "password": "hunter2"}) 时会发生什么
  • @Avinash password 将被解组,但abc11 不会,因为它不匹配目标结构中的任何标记,并且结构的Username 字段,带有标记abc,将保持不变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 2021-08-09
  • 2016-05-12
  • 2021-10-16
  • 1970-01-01
相关资源
最近更新 更多