当我们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 "成功!";
}
运行效果: