webapi 接口参数验证

16 篇文章 2 订阅

当我们api接口,被客户端调用时,因为客户端参数是不可信的,需要对客户端的参数进行验证,如:必填非空,字符长度,参数是否合法…等情况;如果是几个参数我们可以简单的if判断+正则表达式就可处理,但是如果遇到非常多的参数,如果还是if判断,代码的质量非常低,阅读起来也不美观。

[HttpPost]
public string Test([FromBody] Personnel entity)
{
		//判断处理
    if(string.IsNullOrEmpty(entity.Name))
        return "用户名必须填";
        
    if (1>entity.Aage && entity.Aage<100)
        return "Age参数只能 大于1 小于100";
        
    if (string.IsNullOrEmpty(entity.PhoneNum))
        return "电话号码必填";
        
    string regex= @"^1[3456789]\d{9}$";
    if (! Regex.IsMatch(entity.PhoneNum, regex))
        return "电话格式不正确";
		//end        
    return "成功!";   //逻辑处理
}

以上代码在验证判参数,代码质量非常低,且阅读起来非常不美观。
优化方案:添加自定义参数验证过滤器
参考博文:【1】【2】【3】 【4】

1、创建自定义ModeActionFilter过滤器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
using System.Web.Http.ModelBinding;

namespace FIS.WebService.App_Start
{
    public class ModeActionFilter:ActionFilterAttribute
    {
        /// <summary>
        /// 接口请求前验证数据
        /// </summary>
        /// <param name="actionContext">上下文</param>
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            if (actionContext.ModelState.IsValid == false)
            {
                // Return the validation errors in the response body.
                // 在响应体中返回验证错误信息
                var errors = new Dictionary<string, IEnumerable<string>>();
                foreach (KeyValuePair<string, ModelState> keyValue in actionContext.ModelState)
                {
                    errors[keyValue.Key] = keyValue.Value.Errors.Select(e => e.ErrorMessage);
                }

                //actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, new
                //{
                //    code = HttpStatusCode.BadRequest,//返回客户端的状态码
                //    success = false,
                //    error = errors//显示验证错误的信息
                //});

                actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, new ResultStr()
                {
                    content = null,
                    isSuccess = false,
                    message = actionContext.ModelState.FirstOrDefault().Value.Errors.FirstOrDefault().ErrorMessage
                });

            }
        }

    }
}

2、实体类
注解属性来设置模型属性的验证规则

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;

namespace FIS.Model
{
   public class Personnel
    {
        [Required(ErrorMessage = "用户名必须填")]
        public string Name { get; set; }

        [Range(1,100,ErrorMessage ="Age参数只能 大于1 小于100")]
        public int Aage { get; set; }

        [Required(ErrorMessage ="电话号码必填")]
        [RegularExpression("^[1]+[3,4,5,7,8]+\\d{9}",ErrorMessage ="电话格式不正确")]
        public string PhoneNum { get; set; }
    }
}

Controller 中添加ModeActionFilter

[ModeActionFilter]
[HttpPost]
public string Test([FromBody] Personnel entity)
{
    return "成功!";
}

运行效果:
在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值