通常情况下,对于那些经常为别人提供数据接口的开发人员来说,对于调用方传递过来的参数都会有验证处理。例如:

if (string.IsNullOrEmpty(entity.Name))
{
//当姓名为空时,.........
}
if (entity.Age<0 || entity.Age>100)
{
//当年龄小于0或大于100时,有的人可能超过一百岁,我希望我的有生之年Age>100,emm,.........
} if (string.IsNullOrEmpty(entity.PhoneNum))
{
//当电话号码为空时,.........
}
if (!string.IsNullOrEmpty(entity.PhoneNum))
{
Regex regex = new Regex("^1[34578]\\d{9}$");
var result=regex.IsMatch(entity.PhoneNum);
if (!result)
{
//当电话号码格式不合法时,......... }
}
//以下还有50个字段需要验证,是不是有种绝望的感觉,有木有?有木有?有人可能会跟调用者说,某个字段必须怎么怎么样,有些人就喜欢故意传错,故意刁钻,到头来,最苦逼的还是写接口的人。

有时候一个系统有十几二个接口,光验证的代码就一大堆,真的有时候不想写,都说程序猿是最聪明的一批人,自然有好的解决方法。

C# webapi 有一种叫模型验证的东西,在java里面,应该有一种注解的东西可以处理。

在ASP.NET Web API中,你可以使用System.ComponentModel.DataAnnotations命名空间的注解属性来设置模型属性的验证规则。考虑以下模型:

public class Personnel
{
[Required(ErrorMessage = "Name参数不能为空")]//Required 验证这个参数不能为空 ErrorMessage:为空时自定义错误信息
public string Name { get; set; } [Range(1,100, ErrorMessage="Age参数只能是大于1,小于100")]//Range 验证值只能在某些范围内,只适用于Int类型的字段
public int Age { get; set; } [Required(ErrorMessage = "电话号不能为空")]
[RegularExpression("^[1]+[3,4,5,7,8]+\\d{9}", ErrorMessage = "PhoneNum不合法的电话号码格式")]//RegularExpression 用正则验证字段的合法性,多用于身份证、电话号码、邮箱、等等...
public string PhoneNum { get; set; }
}

这样的话就可以节省大量冗余代码,那么,接下来如何去处理呢?

在接口请求之前,我们可以对客户端传过来的数据进行模型验证处理,对于webapi比较熟悉的人应该知道过滤器,不知道的可以看我前面的文章,如何使用webapi三大过滤器,过滤器是基于AOP,面向切面的编程思想。

在这里我们用的ActionFilterAttribute过滤器,只要继承这个接口并且实现其中的OnActionExecuting方法就行。具体实现如下:

using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
using System.Web.Http.ModelBinding; namespace Huajie.Application.Web.Controllers.Apis
{
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//显示验证错误的信息
});
}
}
}
}

在WebApiConfig.cs里面注册一下这个过滤器

config.Filters.Add(new ModeActionFilter());

请求方法示例:

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

自定义返回 (返回请求成功HttpStatusCode.OK 并且有多个错误 取第一个即可)

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

Asp.net webapi 判断请求参数是否为空简易方法 Model Validation 判断请求参数是否为空的更多相关文章

  1. 彻底解决Asp.netCore WebApi 3.1 跨域时的预检查204 options重复请求的问题

    Asp.netCore WebApi 3.1 跨域的预检查options问题 1:我们直接使用core跨域的中间件 ,注入跨域服务, services.AddCors(options => { ...

  2. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  3. [原创] ASP.NET WEBAPI 接入微信公众平台 总结,Token验证失败解决办法

    首先,请允许我说一句:shit! 因为这个问题不难,但是网上有关 ASP.NET WEBAPI的资料太少.都是PHP等等的. 我也是在看了某位大神的博客后有启发,一点点研究出来的. 来看正题! 1.微 ...

  4. Asp.Net WebApi核心对象解析(二)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  5. Asp.Net WebApi核心对象解析

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  6. ASP.NET WebApi技术从入门到实战演练

    一.课程介绍 曾经有一位不知名的讲师说过这么一句名言: 一门RPC技术不会,那么千万万门RPC技术将都不会!在今天移动互联网的时代,作为攻城师的我们,谁不想着只写一套API就可以让我们的Web, An ...

  7. 路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) ASP.NET WebApi技术从入门到实战演练 C#面向服务WebService从入门到精通 DataTable与List<T>相互转换

    路由其实也可以很简单-------Asp.net WebAPI学习笔记(一)   MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一位程序猿,在他MVC程序中, ...

  8. ASP.NET WebAPI Get和Post 传参总结

    这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jque ...

  9. Asp.Net WebApi Post请求整理(一)

    Asp.Net WebApi+JQuery Ajax的Post请求整理 一.总结 1.WebApi 默认支持Post提交处理,返回的结果为json对象,前台不需要手动反序列化处理.2.WebApi 接 ...

随机推荐

  1. Matlab 画图2

    fplot函数 plot函数的缺点:在实际应用中,函数随着自变量的变化趋势是未知的,如果自变量的离散区间不合理,则无法反应函数的变化趋势. fplot的作用:通过自适应算法,解决上述问题. fplot ...

  2. Java基础教程——泛型

    泛型 Generics:泛型,愿意指"无商标的". 泛型,可以理解为"宽泛的数据类型",就是将类型由原来的具体的类型泛化. 泛型在建立对象时不指定类中属性的具体 ...

  3. 【VSA】One-shot video-based person re-identification with variance subsampling algorithm

    目录 解决了什么问题 主要贡献和创新点 基本框架 提出的方法 01 variance confidence方差置信度 02 Variance Subsampling Algorithm 方差二次采样算 ...

  4. Python爬虫实战案例:取喜马拉雅音频数据详解

    前言 喜马拉雅是专业的音频分享平台,汇集了有声小说,有声读物,有声书,FM电台,儿童睡前故事,相声小品,鬼故事等数亿条音频,我最喜欢听民间故事和德云社相声集,你呢? 今天带大家爬取喜马拉雅音频数据,一 ...

  5. moviepy音视频开发:音频文件存取类AudioFileClip属性和方法介绍

    ☞ ░ 前往老猿Python博文目录 ░ 一.概述 AudioFileClip是AudioClip的直接子类,用于从一个音频文件或音频数组中读入音频到内存构建音频剪辑.但AudioFileClip并不 ...

  6. PyQt信号connect连接槽方法时报:native Qt signal is not callable错误

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在将一个信号连接到槽方法时,程序异常退出,捕获异常 ...

  7. Python基础教程目录

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python部分代码样例 老猿Python重难点知识博文汇总 老猿Python博客地址 第1章 Python学习环境构建目 ...

  8. PyQt(Python+Qt)学习随笔:在父窗口中弹出子窗口无法显现的问题

    在学习和测试PyQt相关部件功能的时候,老猿经常是不同的窗口新建一个类,再新建一个Application来使用这个窗口类进行测试. 为了减少应用框架代码的重复开发,老猿决定采用主窗口叠加测试窗口的模式 ...

  9. jquery.sticky 粘性滚动插件使用

    一个jQuery插件,使你能够做任何元素在您的网页上总是可见的,可以作为顶部固定导航显示插件. 官网地址:http://stickyjs.com/ github:https://github.com/ ...

  10. [原创] C# 金额大写

    突然要用到这个功能.也网上找了下. 最后还是自动动手写了一个. 估计这个还是有人要要的,所以顺便发出来吧. 引用保留 https://www.cnblogs.com/goldli/p/14105832 ...