【接口验证】特性验证参数

简介: 介绍: 在我们实际项目中会经常进行post,get请求这些都避免不了一些参数,有参数就有合法有效的意思。比如我一个数就想保证几位,多了不允许,或者默写字段不可以为空值等。以前我们都是卸载方法中一个一个去判断,现在我们认识一个新朋友。

介绍:

在我们实际项目中会经常进行post,get请求这些都避免不了一些参数,有参数就有合法有效的意思。比如我一个数就想保证几位,多了不允许,或者默写字段不可以为空值等。以前我们都是卸载方法中一个一个去判断,现在我们认识一个新朋友。

此文章不说多深就是一个简单使用记录,所有还请见谅,大神绕行!!!!

数据注解Data Annotations:

首先:Data Annotations是在System.ComponentModel.DataAnnotations命名空间下:所有我们使用要先引用命名空间:

该命名空间下有很多帮助类:

   !!!!!!!!!有时间补充!!!!!!

代码示例:

首先定义参数接受类:

   public class ParameClass
    {
        public int Id { get; set; }
        [Required(ErrorMessage="请输入姓名")]
        public string Name { get; set; }
        [Range(0, 10)]
        public double value { get; set; }
       
    }
View Code

我们经常使用mvc对Required特性最熟悉了,没有错我就是定一个name属性为必填项,定义一个value为0-10位;Range(minimum,maximum)很好理解。

好了定义好了参数类,我们就开始定一个特性类来对参数的有效性做处理:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method , Inherited = true)]
    public class ValiDateAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {

            if (actionContext.ModelState.IsValid == false)
            {
                actionContext.Response = actionContext.Request.CreateErrorResponse(
                    HttpStatusCode.BadRequest, actionContext.ModelState);
            }

        }
    }
View Code

下面补全一个遍历验证的方法:

var modelState = actionContext.ModelState;
            if (!modelState.IsValid)
            {
                string error = string.Empty;
                foreach (var key in modelState.Keys)
                {
                    var state = modelState[key];
                    if (state.Errors.Any())
                    {
                        error = state.Errors.First().ErrorMessage;
                        break;
                    }
                }
              var response = new{ Status = 404, Message = error };
                actionContext.Response = new HttpResponseMessage(HttpStatusCode.Accepted)
                {
                    Content = new StringContent(JsonConvert.SerializeObject(response), System.Text.Encoding.GetEncoding("UTF-8"), "application/json")
                };
            }
View Code

这里会引用很多命名空间引用即可,没有别的。

配置注册:

第一种当然是在使用的方法方面直接加特性

第二种就是全局配置:在WebApiConfig文件的Register方法里面注册:

 //注册验证 
            config.Filters.Add(new ValiDateAttribute());

效果:

 

注意:注意:注意:在webAPI中必须请求加上参数参可以看到效果,不然一直是默认值,不会验证,还没想到解决办法。

好了这就是简单使用步骤。在mvc控制器我还没有弄,以后弄了会补上!!!!!!!

 补充:2018-06-21

一些验证规则:

    Required(ErrorMessage):必须输入值;ErrorMessage ="";用来定义返回的说明

 

    StringLength(value):字符长度;存在:ErrorMessage

    Range(min,max):字符范围;存在:ErrorMessage

    RegularExpression:允许输入正则表达式存在:ErrorMessage

自定义实现规则写法:

首先肯定是要继承:ValidationAttribute (当然也可以继承子类)

注意:如果继承父类,要实现自定义验证方法,不然运行会报错:

实例代码:

   public class CustomAttribute : ValidationAttribute
    {
        //构造函数
        public CustomAttribute()
        {

        }
        //错误返回值
        public override string FormatErrorMessage(string name)
        {
            return "只能输入男或者女";
        }
        //验证重写【规则】
        public override bool IsValid(object value)
        {
            if (value.ToString() == "" || value.ToString() == "")
            {
                return true;
            }
            return false;
        }
        
    }
View Code

 mvc移植:

在mvc中直接使用是不好使用的,因为使用的命名空间不一样可能是,但是方法不同吧,没细研究,我使用了一个折中的方式来实现(以后在发现在补充):

就是在mvc中我这这个方法中直接获取参数名称,然后对参数名称的值取出来进行验证,所有所有的验证不是写在了实体类上面,而是写在了这个方法中:

public override void OnActionExecuting(ActionExecutingContext actionContext)
        {

            var parames = actionContext.ActionParameters;
            foreach (var key in parames.Keys)
            {
                if (key == "name")
                {
                    var state = parames[key];
                    if (string.IsNullOrEmpty(state.ToString()))
                    {
                        JsonResult ajaxRes = new JsonResult();
                        ajaxRes.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
                        ajaxRes.Data = "请输入名称";
                        actionContext.Result = ajaxRes;
                    }
                }
                if (key == "age")
                {
                    var state = parames[key];
                    if ((int)state<0|| (int)state>10)
                    {
                        JsonResult ajaxRes = new JsonResult();
                        ajaxRes.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
                        ajaxRes.Data = "请输入年龄0-10";
                        actionContext.Result = ajaxRes;
                    }
                }
                if (key == "sex")
                {
                    var state = parames[key];
                    if (state.ToString() == "" || state.ToString() == "")
                    {                     
                    }
                    else {
                        JsonResult ajaxRes = new JsonResult();
                        ajaxRes.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
                        ajaxRes.Data = "请输入男或者女";
                        actionContext.Result = ajaxRes;
                    }
                }
            }          

        }
View Code

这样子就跟Data Annotations这个没有关系了,不管怎么样先实现这个类似的效果仅作记录笔记吧。使用和特新一样用,写在方法上面即可。

 特性使用范围补充:

 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method , Inherited = true)]

 AttributeUsageAttribute(AttributeTargets validOn);:用指定的属性允许多个来指定该特性适用于那些。比如类,方法,程序集。

AttributeTargets:枚举类型,包含了AttributeUsageAttribute所运行的属性值。

    Assembly = 1:可以对程序集应用属性

    Module = 2:可以对模块应用属性。

    Class = 4:可以对类应用属性。
    Struct = 8:可以对结构应用属性,即值类型。
    Enum = 16,可以对枚举应用属性
    Constructor = 32:可以对构造函数应用属性。
    Method = 64:可以对方法应用属性。
    Property = 128:可以对属性 (Property) 应用属性 (Attribute)。
    Field = 256:可以对字段应用属性。
    Event = 512:可以对事件应用属性。
    Interface = 1024,可以对接口应用属性。
    Parameter = 2048:可以对参数应用属性。
    Delegate = 4096:可以对委托应用属性。
    ReturnValue = 8192:可以对返回值应用属性。
    GenericParameter = 16384:可以对泛型参数应用属性。
    All = 32767:可以对任何应用程序元素应用属性。

 

作者:YanBigFeg —— 颜秉锋

出处:http://www.cnblogs.com/yanbigfeg

本文版权归作者和博客园共有,欢迎转载,转载请标明出处。如果您觉得本篇博文对您有所收获,觉得小弟还算用心,请点击右下角的 [推荐],谢谢!

目录
相关文章
|
4月前
|
JSON 前端开发 API
构建前端防腐策略问题之更新getMemoryUsagePercent函数以适应新的API返回格式的问题如何解决
构建前端防腐策略问题之更新getMemoryUsagePercent函数以适应新的API返回格式的问题如何解决
构建前端防腐策略问题之更新getMemoryUsagePercent函数以适应新的API返回格式的问题如何解决
|
6月前
参数验证工具
参数验证工具
38 0
|
7月前
|
算法 安全 Java
对外接口验证sign工具
对外接口验证sign工具
|
7月前
|
数据采集 存储 安全
数据功能验证
数据功能验证
118 4
|
关系型数据库 MySQL 数据安全/隐私保护
nest自定义验证类及自定义验证装饰器
nest自定义验证类及自定义验证装饰器
接口参数注解验证案例
写作缘由 写接口的时候经常会有请求体里某字段不为null的需求;也有使用一个dto对象,但是插入和修改都想使用这个dto,那这样的话判断条件就不一样,因为修改操作必须有ID,所以参数验证还是挺麻烦的。所以写个demo记录一下,亲测可用。
144 0
|
XML SQL JSON
接口自动化测试,一键快速校验接口返回值全部字段
在日常开展自动化测试工作时,为了保证接口测试的有效性,少不了要对接口返回的响应字段进行校验、断言等操作。当接口返回的字段数量本身就很少时,接口断言操作一般都很容易就能实现,但当接口的返回字段特别多,结构特别复杂时,例如响应字段数量达到了成百上千时,如何快速实现全部返回字段的校验?
582 0
接口自动化测试,一键快速校验接口返回值全部字段
|
JavaScript 前端开发 Java
6. 自定义容器类型元素验证,类级别验证(多字段联合验证)
6. 自定义容器类型元素验证,类级别验证(多字段联合验证)
|
SQL 安全 数据库
基于令牌的服务器访问验证失败,出现基础结构错误。请检查以前的错误
一数据库服务器(SQL Server 2014)上的一个作业执行报错,具体错误信息如下:   Executed as user: NT SERVICE\SQLSERVERAGENT. 用户 &#39;xxxx\xxxxx$&#39; 登录失败。
1951 0
基于令牌的服务器访问验证失败,出现基础结构错误。请检查以前的错误
|
Java 数据库连接 Spring
Controller 层参数校验方案
思路 Controller层有两种校验场景 单个参数的校验 // 用户登录 Controller 方法 @PostMapping("/login") public Message login(String verifyCode,String account,String password){ //.
2763 0