gin定义统一处理错误
在gin中如果有错误需要响应给客户端,如果每一个都判断,并且处理返回,如果项目复杂了,需要写很多重复的代码来响应错误,今天我们来封装一个统一处理错误包装器,使用的是装饰器模式。
1.定义统一处理错误
pkg/e/error.go
package eimport "github.com/gin-gonic/gin"//自定义api错误结构体type ApiError struct { Status int `json:"-"` Code int `json:"code"` Message string `json:"message"`}func (err ApiError)Error() string { return err.Message}
2.编写统一错误处理函数
pkg/e/error_wrapper.go
package eimport ( "github.com/gin-gonic/gin" "net/http")type WrapperHandle func(c *gin.Context) (interface{}, error)func ErrorWrapper(handle WrapperHandle) gin.HandlerFunc { return func(c *gin.Context) { data, err := handle(c) if err != nil { apiError := err.(ApiError) c.JSON(apiError.Status, apiError) return } c.JSON(http.StatusOK, gin.H{"data": data}) }}
这里的统一处理只是一个简单的处理,介绍一种思路,具体的可以根据项目进行改造
3.例子
- 编写控制器
api/err_handle.go
package apiimport ( "cn.sockstack/gin_demo/pkg/e" "github.com/gin-gonic/gin" "net/http")func ErrorHandle(c *gin.Context) (interface{}, error) { query := c.Query("q") if query == "" { return nil, e.ApiError{ Status: http.StatusOK, //状态码 Code: 404, Message: "q的参数不能为空", } } if query == "test" { return nil, e.ApiError{ Status: http.StatusOK, //状态码 Code: 404, Message: "q的参数不能为test", } } return query, nil}
- 注册路由
routers/test.go
package routersimport ( "cn.sockstack/gin_demo/api" "cn.sockstack/gin_demo/pkg/e" "github.com/gin-gonic/gin")func test(r *gin.Engine) { //定义/test路由 r.GET("/test", api.Test) //响应json数据 r.GET("/json", api.Json) //响应xml数据 r.GET("/xml", api.Xml) //统一错误处理测试 r.GET("/error", e.ErrorWrapper(api.ErrorHandle))}
- 运行并访问127.0.0.1:8081/error?q=hello
{ "data": "hello"}
正常响应结果
- 运行并访问127.0.0.1:8081/error?q=test
{ "code": 404, "message": "q的参数不能为test"}
- 运行并访问127.0.0.1:8081/error
{ "code": 404, "message": "q的参数不能为空"}
可以看到,两次访问都能处理错误结果,并以json返回,在业务开发中,只要返回自定义的ApiError错误,即可以统一格式返回错误。
这一节介绍的统一错误处理的灵感来源于gin的中间件。
文章来源:智云一二三科技
文章标题:gin定义统一处理错误
文章地址:https://www.zhihuclub.com/6314.shtml
评论已关闭
Proviron – buy cialis pills Mrtxcf Buy Levothyroxine Europe Qwvblf – cheapest cialis generic online DO NOT WAIT. Yiajcw
Zithromax For Sale – Cialis Ugmsmz Jzwipz viagra droga Jjtksq – Cialis Lfnyhk viagra efectos cara