[TOC]
  • iris请求数据验证目录结构代码示例

iris请求数据验证

目录结构

主目录readJsonStructValidation

    —— main.go

代码示例

main.go

//包main显示验证器(最新版本9)与Iris的集成。//您可以在以下网址找到更多这样的示例:https//github.com/go-playground/validator/blob/v9/_examplespackage mainimport (    "fmt"    "github.com/kataras/iris"    // $ go get gopkg.in/go-playground/validator.v9    "gopkg.in/go-playground/validator.v9"    //"gopkg.in/go-playground/validator.v8")//用户包含用户信息。type User struct {    FirstName      string     `json:"fname"`    LastName       string     `json:"lname"`    Age            uint8      `json:"age" validate:"gte=0,lte=130"`    Email          string     `json:"email" validate:"required,email"`    FavouriteColor string     `json:"favColor" validate:"hexcolor|rgb|rgba"`    Addresses      []*Address `json:"addresses" validate:"required,dive,required"`}//地址包含用户地址信息type Address struct {    Street string `json:"street" validate:"required"`    City   string `json:"city" validate:"required"`    Planet string `json:"planet" validate:"required"`    Phone  string `json:"phone" validate:"required"`}// Use a single instance of Validate, it caches struct info.//使用Validate的单个实例,它缓存struct info。var validate *validator.Validatefunc main() {    validate = validator.New()    //为'用户'注册验证    //注意:只需要为'User',validator注册一个非指针类型    //在类型检查期间内部取消引用。    validate.RegisterStructValidation(UserStructLevelValidation, User{})    app := iris.New()    app.Get("/user", func(ctx iris.Context) {        fmt.Println("test")        var user User        if err := ctx.ReadJSON(&user); err != nil {            // 处理错误            fmt.Println(err)        }        //为错误的验证输入返回InvalidValidationError,nil或ValidationErrors([] FieldError)        err := validate.Struct(user)        if err != nil {            //只有在您的代码可以生成时才需要进行此检查            //验证的无效值,例如与nil的接口            //大多数包括我自己的值通常不会有这样的代码。            if _, ok := err.(*validator.InvalidValidationError); ok {                ctx.StatusCode(iris.StatusInternalServerError)                ctx.WriteString(err.Error())                return            }            ctx.StatusCode(iris.StatusBadRequest)            for _, err := range err.(validator.ValidationErrors) {                fmt.Println()                fmt.Println(err.Namespace())                fmt.Println(err.Field())                fmt.Println(err.StructNamespace()) //注册自定义TagNameFunc时可能会有所不同                fmt.Println(err.StructField()) //通过将alt名称传递给ReportError,如下所示                fmt.Println(err.Tag())                fmt.Println(err.ActualTag())                fmt.Println(err.Kind())                fmt.Println(err.Type())                fmt.Println(err.Value())                fmt.Println(err.Param())                fmt.Println()                //或者将它们收集为json对象                //并通过ctx.JSON将收集的错误发送回客户端                // {                //     "namespace":        err.Namespace(),                //     "field":            err.Field(),                //     "struct_namespace": err.StructNamespace(),                //     "struct_field":     err.StructField(),                //     "tag":              err.Tag(),                //     "actual_tag":       err.ActualTag(),                //     "kind":             err.Kind().String(),                //     "type":             err.Type().String(),                //     "value":            fmt.Sprintf("%v", err.Value()),                //     "param":            err.Param(),                // }            }            ctx.WriteString("testasdd")            //从这里你可以用你想要的任何语言创建自己的错误信息。            return        }        //将用户保存到数据库    })    //使用Postman或其他什么来做POST请求    //使用RAW BODY的http//localhost:8080/user    /*        {            "fname": "",            "lname": "",            "age": 45,            "email": "mail@example.com",            "favColor": "#000",            "addresses": [{                "street": "Eavesdown Docks",                "planet": "Persphone",                "phone": "none",                "city": "Unknown"            }]        }    */    //Content-Type to application/json(可选,如果选择更好)。    //由于空的`User.FirstName`(json中的fname),此请求将失败    //和`User.LastName`(json中的lname)。    //检查iris应用程序终端输出    app.Run(iris.Addr(":8080"), iris.WithoutServerError(iris.ErrServerClosed))}// UserStructLevelValidation包含并非总是的自定义结构级别验证//在字段验证级别有同样有意义。例如,此函数验证了这一点//存在FirstName或LastName; 可以通过自定义字段验证完成,但随后//必须将它添加到复制逻辑+开销的两个字段中,这样就可以了,仅验证一次。////注意:您可能会问为什么我不能在验证器之外执行此操作,因为这样做//挂钩到验证器,你可以与验证标签结合,但仍然有常见错误输出格式。func UserStructLevelValidation(sl validator.StructLevel) {    user := sl.Current().Interface().(User)    if len(user.FirstName) == 0 && len(user.LastName) == 0 {        sl.ReportError(user.FirstName, "FirstName", "fname", "fnameorlname", "")        sl.ReportError(user.LastName, "LastName", "lname", "fnameorlname", "")    }    //加上可以更多,甚至使用不同于“fnameorlname”的标签。}