-
-
Notifications
You must be signed in to change notification settings - Fork 175
请求参数验证
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();