不知道大家在使用 Gin 构建 API 服务时有没有这样的问题:
- 参数绑定的环节可不可以自动处理?
- 错误可不可以直接返回,不想写空
return
, 漏写就是bug
本文通过简单地封装,利用 go 的接口特性,提供一个解决上述两个问题的思路
一、解决过程
1.1 刚开始时写 API 服务时
我们刚开始使用 Gin 写 API 服务时,一般会按照官方文档上的 这么写
// User 用户结构
type User struct {
UserName string
}
// CreateUser 创建用户
func CreateUser(ctx *gin.Context) {
var params User
if err := ctx.ShouldBind(¶ms); err != nil {
ctx.JSON(http.StatusBadRequest, gin.H{
"code": 400,
"msg": "参数错误",
})
logrus.Errorf("params err, %v", params)
return
}
// 一些其他的业务逻辑 ...
ctx.JSON(http.StatusOK, gin.H{
"code": 0,
"msg": "创建成功",
})
}
func main() {
r := gin.Default()
r.POST("user", CreateUser)
if err := r.Run(":8080"); err != nil {
logrus.Fatalf("can not start serve: %v", err)
}
}
1.2 封装返回值
我们写了一段时间之后,会发现,我们的返回值的结构是固定的,为什么不抽象一下呢,所以我们创建了一个结构体 Resp
,并且封装了两个方法用于成功和失败这两种状态的返回
// resp.go
// Resp 返回
type Resp struct {
Code int
Msg