博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从简单类型到复杂类型的参数传递用例,以及传递简单string类型的解决办法
阅读量:7003 次
发布时间:2019-06-27

本文共 2308 字,大约阅读时间需要 7 分钟。

一,简单类型的传值

 
比如 public Users Get(int id) ,它可以使用两种方式获取:
 
api/default/5
$.get("/api/default",{id:90}, function (data) {/* 处理逻辑 */});
前者不需要注明参数名,后者适用于存在多个简单参数的情况,例如比较实际的案例以及对应的获取方式是:
 
public Users Get(int id, int id2)
$.get("/api/default",{id:90,id2:88}, function (data) {});
二,简单类型传值中涉及到string的传递
 
对于简单类型的参数传值,唯一有一点可以称得上是问题的问题,便是遇到例如:public string Post(string v) 这样的情况,如果你直接post一个参数名为v的字符串过去,例如:$.post("/api/testString",{ v: "i want testString" }, function (data) {}); ,那么结果是无功而返的:
 
 
 
 
通过搜索stackoverflow以及encosia(详见这里),下面是解决方案:
 
首先为参数覆盖上[FromBody]特性,比如 public string Post([FromBody]string v),然后:
 
解决方案1:$.post("/api/testString", "=i want testString" , function (data) {}); //在前面加一个等于号
解决方案2:$.post("/api/testString",{ "": "i want testString" }, function (data) {}); //传递一个空参数名
问题是解决了,可是本人也唠叨一句:这像什么话。
 
诚然道有些朋友会说“Web API不是这样使用的,它是为某某某情况……你应该构造一个对象……”,但是,既然存在如此的使用情况,本文所针对就是可能出现的问题而作出解决方案。
 
 
 
三,传递复杂类型:
 
首先定义两个类型,
 
    public class Users
    {
        public int uid { get; set; }
 
        public string username { get; set; }
    }
    public class DoubleStringPrameter
    {
        public string Pram1 { get; set; }
 
        public string Pram2 { get; set; }
    }
对于需要发送两个字符串参数的情况,必须传递一个对象了:
 
public string Post(DoubleStringPrameter pram)
$.post("/api/testStringUsingObject", { Pram1: "参数1的值", Pram2: "参数2的值" }, function (data) {}); //不需要指定参数名
而对于需要传递更加复杂的对象,例如同时传递 DoubleStringPrameter 和 Users ,就需要这么封装:
 
 
 
 
    public class using2ObjController : ApiController
    { 
        public string Post(IMultiObj obj)
        {
            return "uid:" + obj.User.uid + ",username:" + obj.User.username + "||pram1:" + 
                obj.StringPrameter.Pram1 + ",pram2:" + obj.StringPrameter.Pram2;
        } 
    }
 
    public class IMultiObj //定义一个类型封装
    {
        public DoubleStringPrameter StringPrameter { get; set; }
 
        public Users User { get; set; }
    }
 
 
 
然后这么传递:
 
      $.post("/api/using2Obj", { User: { uid: '80909', username: 'amazon' }, StringPrameter: { Pram1: '参数1的值', Pram2: '参数2的值' } },
 
  function (data) {});
 
 
 
 
 
对于简单类型传值中涉及到string的传递,本人的意见是:作为一个API,如果提供了某些功能,那么就必须实现,如果做不到或者不愿意做,就应该在编译期间断绝问题发生的可能(就不应该让 Post(string a)、Post(string a, string b)、Post(Users  u1, Users u2) 通过编译),而不应是在使用期间采取对用户做出 “方言” 级的限制,这已经有违强类型语言的设计初衷,试想这样的情况:某一夜某个零时工打瞌睡写了Post(Users  user, Content content),编译过去了,一个月后客户端那边都已做了2万行代码,到时候才说不能这样使用(不能用你还写出来干什么),这便是设计上的失职了。
 
如今这些不是问题的问题在2.0上依然存在,它既是Bug,同时也不是Bug。
 
对此本人更偏向于使用WCF或MVC的return Json(),出于Web API的问题本身,而作此文。

转载于:https://www.cnblogs.com/ranran/p/4208976.html

你可能感兴趣的文章
linux 命令之 --用户管理
查看>>
二叉树基本操作实现
查看>>
怎么处理警告:编码 GBK 的不可映射字符
查看>>
Exchange Server 2010下,检测用户密码到期通知提醒脚本
查看>>
java基础--java静态代码块和静态方法的区别、static用法
查看>>
zabbix邮箱告警的详细配置
查看>>
使用基本ACL规则限制用户登录
查看>>
linux 文件查看命令 文件和目录属性
查看>>
由我主讲的软件测试系列视频之性能测试系列视频讲座目录出炉了
查看>>
dropdownlist用法
查看>>
二分查找、二分查找小于等于key的最后一个元素、二分查找大于等于key的第一个元素...
查看>>
PGA的调整建议
查看>>
C#进行Visio二次开发相关事件汇总
查看>>
安装fontconfig2.4.2时make报错解决
查看>>
试析软件测试的错觉及发展方向
查看>>
QTP自动化测试自学手册V2.0版本
查看>>
80后收入是怎样一个水平?看完网友工资单,对不起 拖大家内裤了
查看>>
有关软件测试的五大谣言
查看>>
find(2)
查看>>
jquery-1.4.4.min.js无法解析json中result.data问题
查看>>