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 }