gin框架-参数绑定方法ShouldBind和BindJSON的区别

Gin框架踩坑—[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 400 with 200

复现场景:使用结构体绑定方式接受参数,参数绑定失败,代码已返回200,但客户端收到的httpcode为400,无论开发者如何强制返回httpcode,code就是400

原因 :

行为 – 这些方法MustBindWith在引擎盖下使用。如果存在绑定错误,则请求被中止c.AbortWithError(400, err).SetType(ErrorTypeBind)。这将响应状态码设置为400,并将Content-Type标题设置为text/plain; charset=utf-8。请注意,如果在此之后尝试设置响应代码,将会导致警告[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 400 with 422。如果您希望更好地控制行为,请考虑使用ShouldBind等效的方法。

解决方法 : 绑定结构体的方法一概不适用【BindJSON】改为【ShouldBind】

 1 func GetPerson(ctx *gin.Context) {
 2 
 3     var p Person
 4     ctx.ShouldBind(&p)
 5     
 6     //ctx.BindJSON()
 7     isOK := http.StatusOK
 8 
 9     collection := connect.Database("community").Collection("t_person_info")
10     filter := bson.M{}
11     message := "success"
12 
13     filter["id"] = p.Id
14     cursor, err := collection.Find(context.Background(), filter)
15     if err != nil {
16         log.Println("Find查询异常", err)
17         message = "fail"
18         isOK = http.StatusBadRequest
19     }
20     var result []Person
21     err = cursor.All(context.Background(), &result)
22     if err != nil {
23         log.Println("ALL查询异常", err)
24         message = "fail"
25         isOK = http.StatusBadRequest
26 
27     }
28     log.Printf("查询结果:%#v", result)
29     ctx.JSON(isOK, gin.H{
30         "messag": message,
31         "data":   result,
32     })
33 }

 

posted @ 2023-02-03 15:27  ilovetesting  阅读(1006)  评论(0编辑  收藏  举报