自定義Respone好處
在寫接口的時候,我們通過都需要将前端小夥伴發給我們的請求進行校驗和傳回資料,如果是正确的請求參數,那麼也符合我們的校驗,則需要傳回資料給他們,并且給予提示;反之,如果請求是不符合的我們則需要基于提示使用者或讓前端小夥伴進行做出對應的修改,比如:參數類型錯誤、字段錯誤等資訊回返給前端的小夥伴進行做出對應的修改。這時候有些提示資訊則會重複,一直寫重複的提示難免會有點繁瑣,那麼作為後端開發的小夥伴們可以選擇對于這些
response
進行封裝一些方法,減少所謂的重複性代碼,也可以提高我們自己的代碼可閱讀性和品質。本文結合了上一篇文章中的zap封裝的日志開發進行完成本次的例子,可以點選通路Go開發中配置一個Logger日志的功能實作(結合zap日志庫)
編碼
下列的編碼僅供參考,可以根據自己喜歡的方式進行定義,或者根據自己的業務場景進行編碼
定義傳回格式
首先我們肯定是需要定義格式,到時候把這個格式告訴前端小夥伴,他們就可以根據這個格式也可以封裝一些方法,提高整體項目的開發效率和代碼閱讀性,通常前後端的資料互動都是以
json
傳回給前端的,下面我們也以json方式進行編碼。
{
"code": 1001, // 錯誤碼
"msg": "xxx", // 提示資訊
”data“: {}, // 存放資料
}
編寫struct類型 response.go
type ResponseData struct {
Code ResCode `json:"code"`
Msg interface{} `json:"msg"`
Data interface{} `json:"data"`
}
定義code的傳回内容 code.go
type ResCode int64
const (
CodeSuccess ResCode = 1000 + iota
CodeInvalidParam
CodeUserExist
CodeUserNotExist
CodeInvalidPassword
CodeServerBusy
)
var codeMsgMap = map[ResCode]string{
CodeSuccess: "success",
CodeInvalidParam: "請求參數錯誤",
CodeUserExist: "使用者已存在",
CodeUserNotExist: "使用者不存在",
CodeInvalidPassword: "使用者名或密碼錯誤",
CodeServerBusy: "服務繁忙",
}
func (c ResCode) Msg() string {
msg, ok := codeMsgMap[c]
if !ok {
msg = codeMsgMap[CodeServerBusy]
}
return msg
}
編寫傳回方法 response.go
func ResponseError(c *gin.Context, code ResCode) {
c.JSON(http.StatusOK, &ResponseData{
Code: code,
Msg: code.Msg(),
Data: nil,
})
}
/*
// 或者也可以這樣
func ResponseError(c *gin.Context, code ResCode) {
responseData := &ResponseData{
Code: code,
Msg: code.Msg(),
Data: nil,
}
c.JSON(http.StatusOK,responseData )
}
*/
// ResponseSuccess 傳回成功
func ResponseSuccess(c *gin.Context, data interface{}) {
c.JSON(http.StatusOK, &ResponseData{
Code: CodeSuccess,
Msg: CodeSuccess.Msg(),
Data: data,
})
}
// ResponseErrorWithMsg 自定義傳回内容
func ResponseErrorWithMsg(c *gin.Context, code ResCode, msg interface{}) {
c.JSON(http.StatusOK, &ResponseData{
Code: code,
Msg: msg,
Data: nil,
})
}
寫好以後的使用方法
以login登入方法為例
func LoginHandle(c *gin.Context) {
p := new(models.ParamsLogin)
if err := c.ShouldBindJSON(p); err != nil {
// 請求參數有無,直接傳回相應
zap.L().Error("Login with invalid param", zap.Error(err))
errs, ok := err.(validator.ValidationErrors)
if !ok {
ResponseError(c, CodeInvalidParam)
return
}
ResponseErrorWithMsg(c, CodeInvalidParam, removeTopStruct(errs.Translate(trans)))
return
}
if err := logic.Login(p); err != nil {
zap.L().Error("logic.Login with fail", zap.String("username", p.Username), zap.Error(err))
if errors.Is(err, mysql.ErrorUserNotExist) {
ResponseError(c, CodeUserNotExist)
return
}
ResponseError(c, CodeInvalidParam)
return
}
ResponseSuccess(c, nil)
}
最後的成功展示
使用postman或者apifox進行測試一下
成功
和
失敗
的傳回結果吧!
- 成功的傳回請求
- 失敗的傳回請求