目标:使用Gin框架开发接口,返回响应结构封装,统一管理。
$ mkdir response && cd response
封装返回响应的字段结构
$ vim response.go
package response
import (
"encoding/json"
"log"
)
type Response struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data interface{} `json:"data"`
}
// Response 构造函数
func response(code int, msg string) *Response {
return &Response{
Code: code,
Msg: msg,
Data: nil,
}
}
// WithMsg 追加响应消息
func (t *Response) WithMsg(msg string) Response {
return Response{
Code: t.Code,
Msg: msg,
Data: t.Data,
}
}
// WithData 追加响应数据
func (t *Response) WithData(data interface{}) Response {
return Response{
Code: t.Code,
Msg: t.Msg,
Data: data,
}
}
// Json 返回JSON格式的数据
func (t *Response) Json() string {
s := &struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data interface{} `json:"data"`
}{
Code: t.Code,
Msg: t.Msg,
Data: t.Data,
}
raw, err := json.Marshal(s)
if err != nil {
log.Println(err)
}
return string(raw)
}
封装通用错误代码
$ vim error.go
package response
var (
Ok = response(200, "操作成功")
Err = response(500, "操作失败")
)
封装系统级错误编码
$ vim system.go
package response
//服务级错误
var (
ErrParam = response(10001, "参数有误")
ErrSign = response(10002, "签名有误")
ErrCaptcha = response(10003, "验证码错误")
ErrPhone = response(10004, "手机号码不合法")
)
封装用户模块编码
$ vim user.go
package response
//模块级错误 - 用户模块
var (
ErrUserService = response(20001, "用户服务异常")
)
在Gin控制器中返回响应
例如:以用户修改密码为例
func (s *User) Password(c *gin.Context) {
var err error
var p request.Password
var mu model.User
if err = c.ShouldBindJSON(&p); err != nil {
c.JSON(http.StatusOK, response.ErrParam)
return
}
mu = model.User{}
mu.UserName = p.UserName
mu.Password = p.Password
if err, _ = service.NewUser().Password(&mu, p.NewPassword); err != nil {
c.JSON(http.StatusOK, response.Err)
return
}
c.JSON(http.StatusOK, response.Ok)
}
网友评论