<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Go - 統(tǒng)一定義 API 錯(cuò)誤碼

          共 2455字,需瀏覽 5分鐘

           ·

          2021-01-09 21:24

          改之前

          在使用 gin 開發(fā)接口的時(shí)候,返回接口數(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:??"用戶手機(jī)號(hào)不合法",
          ?Data:?nil,
          })

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

          改之后

          //?比如,返回“用戶手機(jī)號(hào)不合法”錯(cuò)誤
          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 表示自定義的錯(cuò)誤碼,下面會(huì)看到定義的地方。

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

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

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

          errno 包源碼

          //?errno/errno.go

          package?errno

          import?(
          ?"encoding/json"
          )

          var?_?Error?=?(*err)(nil)

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

          type?err?struct?{
          ?Code?int?????????`json:"code"`?????????//?業(yè)務(wù)編碼
          ?Msg??string??????`json:"msg"`??????????//?錯(cuò)誤描述
          ?Data?interface{}?`json:"data"`?????????//?成功時(shí)返回的數(shù)據(jù)
          ?ID???string??????`json:"id,omitempty"`?//?當(dāng)前請(qǐng)求的唯一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?格式的錯(cuò)誤詳情
          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")

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

          ?//?模塊級(jí)錯(cuò)誤碼?-?用戶模塊
          ?ErrUserPhone???=?NewError(20101,?"用戶手機(jī)號(hào)不合法")
          ?ErrUserCaptcha?=?NewError(20102,?"用戶驗(yàn)證碼有誤")

          ?//?...
          )

          錯(cuò)誤碼規(guī)則

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

          錯(cuò)誤碼為 5 位數(shù)

          10101
          服務(wù)級(jí)錯(cuò)誤碼模塊級(jí)錯(cuò)誤碼具體錯(cuò)誤碼
          • 服務(wù)級(jí)別錯(cuò)誤碼:1 位數(shù)進(jìn)行表示,比如 1 為系統(tǒng)級(jí)錯(cuò)誤;2 為普通錯(cuò)誤,通常是由用戶非法操作引起。
          • 模塊級(jí)錯(cuò)誤碼:2 位數(shù)進(jìn)行表示,比如 01 為用戶模塊;02 為訂單模塊。
          • 具體錯(cuò)誤碼:2 位數(shù)進(jìn)行表示,比如 01 為手機(jī)號(hào)不合法;02 為驗(yàn)證碼輸入錯(cuò)誤。



          推薦閱讀


          福利

          我為大家整理了一份從入門到進(jìn)階的Go學(xué)習(xí)資料禮包,包含學(xué)習(xí)建議:入門看什么,進(jìn)階看什么。關(guān)注公眾號(hào) 「polarisxu」,回復(fù)?ebook?獲取;還可以回復(fù)「進(jìn)群」,和數(shù)萬 Gopher 交流學(xué)習(xí)。

          瀏覽 114
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费黄色电影网站在线观看 | 簧片在线观看视频 | 欧美视频网站中文字幕 | 婷婷五月天丁香在线 | 亚洲无码AV在线亚洲有码AV在线精品 |