zoukankan      html  css  js  c++  java
  • 每日踩坑 2018-01-09 WebAPI会如何面对 枚举 参数?

    这一块确实有些疑问,

    众所周知 枚举参数我们传送枚举值所对应的数字就行了,

    以前 Leader 跟我讲过,枚举参数会将字符串值也能够成功转化,而且枚举值定义之外的数字也可以被转为枚举值。

    主要的问题在于这后一句,如果定义之外的值能够被转换进去,那么我们是要多写些检查逻辑的。

    枚举定义

            public enum type
            {
                Unknow = 0,
                xxx = 1,
                yyy = 2,
            }

    首先是 GET 方法,使用 URL 来传值。

            [HttpGet]
            [Route("api/test/getlist/{type}")]
            public string[] GetList(type type)
            {
                return new string[] { type.ToString() };
            }

    以下的请求都成功的取到值:

    http://localhost:32076/api/test/getlist/xxx

    http://localhost:32076/api/test/getlist/1

    http://localhost:32076/api/test/getlist/5 (是的没错 进去了 头疼,想起我以前很多都没写过检查

    以下的请求没能成功的取到值:

    http://localhost:32076/api/test/getlist/  (找不到方法

    http://localhost:32076/api/test/getlist/xxxx  (请求无效 枚举参数不能为 null

    然后使用 POST 和 对象参数

            public class Data
            {
                public int Id { get; set; }
    
                public string Name { get; set; }
    
                public type Type { get; set; }
            }
    
    
            [HttpPost]
            [Route("api/test/getlist")]
            public string[] GetList(Data Data)

    http://localhost:32076/api/test/getlist/  (post 空对象 调用ok,当然参数实例为空。

    http://localhost:32076/api/test/getlist/  (post 对象 仅Id传值 调用ok,此时枚举默认值0(关于枚举默认值有很多文章,自行百度。

    也就是说我们应该在接口层对枚举进行基本的值范围检查。

    我见过很多人写反射来做这个检查。其实枚举类上就有NET为我们准备好的方法·。

    送上一个扩展方法:

    1         /// <summary>
    2         /// 检查枚举的值是否在枚举范围内
    3         /// </summary>
    4         /// <param name="value"></param>
    5         /// <returns></returns>
    6         public static bool IsValid(this Enum value)
    7         {
    8             return Enum.IsDefined(value.GetType(), value);
    9         }
  • 相关阅读:
    Error: unable to load xmlsec-openssl library
    count(1)、count(*)与count(列名)的执行区别
    Linux下的压缩zip,解压缩unzip命令详解及实例
    linux centos 如何查看操作系统版本信息
    These dependencies were not found: *!!vue-style-loader!css-loader?
    Git如何永久删除某个重要文件文件或文件夹 (包括历史记录) 强制
    LDAP的filter查询详解
    详谈mysqldump数据导出的问题
    GO -- 遍历删除 数组 slice
    mjml强大&&灵活的邮件模版引擎
  • 原文地址:https://www.cnblogs.com/Aaxuan/p/10243148.html
Copyright © 2011-2022 走看看