国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
[系列] Go - 統(tǒng)一定義 API 錯誤碼

改之前

在使用 gin 開發(fā)接口的時候,返回接口數(shù)據(jù)是這樣寫的。

type response struct {
Code int         `json:"code"`
Msg  string      `json:"msg"`
Data interface{} `json:"data"`
}

// always return http.StatusOK
c.JSON(http.StatusOK, response{
Code: 20101,
Msg:  "用戶手機號不合法",
Data: nil,
})

這種寫法 code、msg 都是在哪需要返回在哪定義,沒有進行統(tǒng)一管理。

改之后

// 比如,返回“用戶手機號不合法”錯誤
c.JSON(http.StatusOK, errno.ErrUserPhone.WithID(c.GetString("trace-id")))

// 正確返回
c.JSON(http.StatusOK, errno.OK.WithData(data).WithID(c.GetString("trace-id")))

errno.ErrUserPhone、errno.OK 表示自定義的錯誤碼,下面會看到定義的地方。

.WithID() 設(shè)置當前請求的唯一ID,也可以理解為鏈路ID,忽略也可以。

.WithData() 設(shè)置成功時返回的數(shù)據(jù)。

下面分享下編寫的 errno 包源碼,非常簡單,希望大家不要介意。

errno 包源碼

// errno/errno.go

package errno

import (
"encoding/json"
)

var _ Error = (*err)(nil)

type Error interface {
// i 為了避免被其他包實現(xiàn)
i()
// WithData 設(shè)置成功時返回的數(shù)據(jù)
WithData(data interface{}) Error
// WithID 設(shè)置當前請求的唯一ID
WithID(id string) Error
// ToString 返回 JSON 格式的錯誤詳情
ToString() string
}

type err struct {
Code int         `json:"code"`         // 業(yè)務編碼
Msg  string      `json:"msg"`          // 錯誤描述
Data interface{} `json:"data"`         // 成功時返回的數(shù)據(jù)
ID   string      `json:"id,omitempty"` // 當前請求的唯一ID,便于問題定位,忽略也可以
}

func NewError(code int, msg string) Error {
return &err{
Code: code,
Msg:  msg,
Data: nil,
}
}

func (e *err) i() {}

func (e *err) WithData(data interface{}) Error {
e.Data = data
return e
}

func (e *err) WithID(id string) Error {
e.ID = id
return e
}

// ToString 返回 JSON 格式的錯誤詳情
func (e *err) ToString() string {
err := &struct {
Code int         `json:"code"`
Msg  string      `json:"msg"`
Data interface{} `json:"data"`
ID   string      `json:"id,omitempty"`
}{
Code: e.Code,
Msg:  e.Msg,
Data: e.Data,
ID:   e.ID,
}

raw, _ := json.Marshal(err)
return string(raw)
}

// errno/code.go

package errno

var (
// OK
OK = NewError(0, "OK")

// 服務級錯誤碼
ErrServer    = NewError(10001, "服務異常,請聯(lián)系管理員")
ErrParam     = NewError(10002, "參數(shù)有誤")
ErrSignParam = NewError(10003, "簽名參數(shù)有誤")

// 模塊級錯誤碼 - 用戶模塊
ErrUserPhone   = NewError(20101, "用戶手機號不合法")
ErrUserCaptcha = NewError(20102, "用戶驗證碼有誤")

// ...
)

錯誤碼規(guī)則

  • 錯誤碼需在 code.go 文件中定義。
  • 錯誤碼需為 > 0 的數(shù),反之表示正確。

錯誤碼為 5 位數(shù)

1 01 01
服務級錯誤碼 模塊級錯誤碼 具體錯誤碼
  • 服務級別錯誤碼:1 位數(shù)進行表示,比如 1 為系統(tǒng)級錯誤;2 為普通錯誤,通常是由用戶非法操作引起。
  • 模塊級錯誤碼:2 位數(shù)進行表示,比如 01 為用戶模塊;02 為訂單模塊。
  • 具體錯誤碼:2 位數(shù)進行表示,比如 01 為手機號不合法;02 為驗證碼輸入錯誤。
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
【Go實戰(zhàn) | 電商平臺】(4) 用戶注冊
Gin實戰(zhàn):Gin+Mysql簡單的Restful風格的API
Go 語言簡介(下)— 特性
一個發(fā)郵件的demo 用golang
真實案例(萬字長文):Bad Code vs Good Code in Golang
PHP對CURL函數(shù)的封裝,支持GET/POST請求
更多類似文章 >>
生活服務
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服