Skip to content

请求参数验证

Henry edited this page Sep 10, 2019 · 1 revision

在数据接口中需要做大量的数据请求验证,而这些工作又相当繁琐和比较大的工作量。组件对WebApi集成了控制器参数验证功能,只需要简单地在参数上标记相关属性即可完成验证。

登陆参数验证

        public bool Login(
            [StringRegion(Min = 6)]string name, 
            [StringRegion(Min = 6)] string pwd)
        {
            return true;
        }

以上验证是要求用户和密码长度都必须大于等于6.

注册参数验证

        [Post]
        public bool Register(
            [StringRegion(Min = 6)]string name,
            [StringRegion(Min = 6)]string pwd,
            [EmailFormater]string email,
            [MPhoneFormater]string phone,
            [UrlFormater]string homePage)
        {
            return true;
        }

以上方法对注册信息包括邮件,手机等进行一个格式的验证

集成的验证类

Non,StringRegion,NumberRegion,DoubleRegion,DateRegion,Regex

HourFormater,UrlFormater,PasswordFormater,PhoneFormater,MPhoneFormater

IDCardFormater,DateFormater,EmailFormater,IPFormater

组件只是提供了一些基础简单的验证

自定义验证

由于业务的多样性,对于数据的验证需求也是非常多的,为了解决这一问题组件支持自定义验证规则;只需要继承ValidationBase属性实现相关验证方法即可,以下是ValidationBase的一些规则

    [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = true)]
    public abstract class ValidationBase : Attribute
    {

        public bool Non { get; set; } = true;

        public int Code { get; set; } = 412;

        public virtual string GetResultMessage(string parameter)
        {

            return "";
        }

        public virtual bool Execute(object data)
        {
            return Non && data != null;
        }
    }

接下来看一下DateRegion是如何实现的

    public class DateRegion : ValidationBase
    {
        public DateRegion()
        {

        }
        public string Min { get; set; }
        public string Max { get; set; }
        public override string GetResultMessage(string parameter)
        {
            if (Min != null && Max != null)
                return $"The '{parameter}' value must between in ({Min},{Max})";
            else if (Min != null)
                return $"The '{parameter}' value must >= {Min}";
            else
                return $"The '{parameter}' value must <= {Max}";
        }
        public override bool Execute(object data)
        {
            if (!Non && data == null)
                return true;
            if (data == null)
                return false;
            DateTime value = (DateTime)data;
            bool result = true;
            if (Min != null)
            {
                result = value >= DateTime.Parse(Min);
                if (!result)
                    return false;
            }
            if (Max != null)
                result = value <= DateTime.Parse(Max);
            return result;
        }
    }

当实现规则后只需要把属性标记在参数上即可

自定义输出

不同业务针对错误响应的数据格式也有不同,组件同样提供这个输出的定义,只需要实现IValidationOutputHandler接口即可;默认实现如下:

    public class ValidationOutputHandler : IValidationOutputHandler
    {
        public void Execute(IHttpContext context, IActionResultHandler handler, ValidationBase validation, ParameterInfo parameterInfo)
        {
            ActionResult actionResult = new ActionResult(validation.Code, validation.GetResultMessage(parameterInfo.Name));
            handler.Success(actionResult);
        }
    }

自定义好输出的方式后,只需要设置到相关HttpServer上即可生效,

mApiServer.ValidationOutputHandler = new ValidationOutputHandler();