Demo 学 Echo Part5 HTTP 错误处理
自定义错误处理程序
覆盖e.HTTPErrorHandler属性
package main
import (
"net/http"
"github.com/labstack/echo"
"gopkg.in/go-playground/validator.v9"
)
type User struct {
Name string `json:"name" validate:"required"`
Email string `json:"email" validate:"required,email"`
Age int `json:"age" validate:"gte=0,lte=80"`
}
type CustomValidator struct {
validator *validator.Validate
}
func (cv *CustomValidator) Validate(i interface{}) error {
return cv.validator.Struct(i)
}
func main() {
e := echo.New()
e.HTTPErrorHandler = func(err error, c echo.Context) {
report, ok := err.(*echo.HTTPError)
if !ok {
report = echo.NewHTTPError(http.StatusInternalServerError, err.Error())
}
c.Logger().Error(report)
c.JSON(report.Code, report)
}
e.Validator = &CustomValidator{validator: validator.New()}
e.POST("/users", func(c echo.Context) error {
u := new(User)
if err := c.Bind(u); err != nil {
return err
}
if err := c.Validate(u); err != nil {
return err
}
return c.JSON(http.StatusOK, true)
})
e.Logger.Fatal(e.Start(":9000"))
}
测试一下:
curl -X POST http://localhost:9000/users \
-d 'name=Joe' \
-d 'email=nope@novalagung.com' \
-d 'age=100'
#output => {"message":"Key: 'User.Age' Error:Field validation for 'Age' failed on the 'lte' tag"}
#服务端也会显示错误Log(c.Logger().Error()输出)
还不错,但是错误提醒对用户不友好,改进一下
package main
import (
"fmt"
"net/http"
"github.com/labstack/echo"
"gopkg.in/go-playground/validator.v9"
)
type User struct {
Name string `json:"name" validate:"required"`
Email string `json:"email" validate:"required,email"`
Age int `json:"age" validate:"gte=0,lte=80"`
}
type CustomValidator struct {
validator *validator.Validate
}
func (cv *CustomValidator) Validate(i interface{}) error {
return cv.validator.Struct(i)
}
func main() {
e := echo.New()
e.HTTPErrorHandler = func(err error, c echo.Context) {
report, ok := err.(*echo.HTTPError)
if !ok {
report = echo.NewHTTPError(http.StatusInternalServerError, err.Error())
}
if castedObject, ok := err.(validator.ValidationErrors); ok {
for _, err := range castedObject {
switch err.Tag() {
case "required":
report.Message = fmt.Sprintf("%s is required",
err.Field())
case "email":
report.Message = fmt.Sprintf("%s is not valid email",
err.Field())
case "gte":
report.Message = fmt.Sprintf("%s value must be greater than %s",
err.Field(), err.Param())
case "lte":
report.Message = fmt.Sprintf("%s value must be lower than %s",
err.Field(), err.Param())
}
break
}
}
c.Logger().Error(report)
c.JSON(report.Code, report)
}
e.Validator = &CustomValidator{validator: validator.New()}
e.POST("/users", func(c echo.Context) error {
u := new(User)
if err := c.Bind(u); err != nil {
return err
}
if err := c.Validate(u); err != nil {
return err
}
return c.JSON(http.StatusOK, true)
})
e.Logger.Fatal(e.Start(":9000"))
}
再来测试一下:
curl -X POST http://localhost:9000/users \
-d 'name=Joe' \
-d 'email=nope@novalagung.com' \
-d 'age=100'
#output => {"message":"Age value must be lower than 80"}
自定义错误页面
package main
import (
"fmt"
"net/http"
"github.com/labstack/echo"
"gopkg.in/go-playground/validator.v9"
)
type User struct {
Name string `json:"name" validate:"required"`
Email string `json:"email" validate:"required,email"`
Age int `json:"age" validate:"gte=0,lte=80"`
}
type CustomValidator struct {
validator *validator.Validate
}
func (cv *CustomValidator) Validate(i interface{}) error {
return cv.validator.Struct(i)
}
func main() {
e := echo.New()
e.HTTPErrorHandler = func(err error, c echo.Context) {
report, ok := err.(*echo.HTTPError)
if !ok {
report = echo.NewHTTPError(http.StatusInternalServerError, err.Error())
}
errPage := fmt.Sprintf("%d.html", report.Code)
if err := c.File(errPage); err != nil {
c.HTML(report.Code, "Errrrooooorrrrr")
}
}
e.Validator = &CustomValidator{validator: validator.New()}
e.POST("/users", func(c echo.Context) error {
u := new(User)
if err := c.Bind(u); err != nil {
return err
}
if err := c.Validate(u); err != nil {
return err
}
return c.JSON(http.StatusOK, true)
})
e.Logger.Fatal(e.Start(":9000"))
}
这时有对应code.html时会show出来,否则就出Errrrooooorrrrr
最后修改于 2019-08-17