一,简单类型的传值

 
比如 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的问题本身,而作此文。

从简单类型到复杂类型的参数传递用例,以及传递简单string类型的解决办法的更多相关文章

  1. 利用自动类型转换存储string类型

    类型转换是我们最常用的功能.就像上战场用的枪一样,敌人用的冲锋枪, 自己手里就一把步枪,打起仗来始终有点不爽. 因此,基本功能的完善很重要. 通常情况下我们需要String类型转其它的基础类型.这时我 ...

  2. Redis学习第二课:Redis String类型及操作

    Strings类型 String是最简单的类型,一个Key对应一个Value,String类型是二进制安全的,可以包含任何数据,比如jpg图片或序列化的对象. Strings类型的操作: Set:设置 ...

  3. C#引用Office.word出错的解决办法-无法嵌入互操作类型“Microsoft.Office.Interop.Word.ApplicationClass” 【转】

    本文章转自 suchso 1.系统找不到 Microsoft.Office.Interop.Word" "Could not load file or assembly 'Micr ...

  4. redis的数据类型(二)string类型

      下面讲解value,value包括String.List.Set.Sorted Set.Hash 一.String类型 1.string类型  String是最基本的类型,而且Stirng类型是二 ...

  5. 在动态sql的使用where时,if标签判断中,如果实体类中的某一个属性是String类型,那么就可以这样来判断连接语句:

    在动态sql的使用where时,if标签判断中,如果实体类中的某一个属性是String类型,那么就可以这样来判断连接语句: 如果是String类型的字符串进行判空的时候: <if test=&q ...

  6. Elasticsearch 6.2.3版本 string 类型字段 排序 报错 Fielddata is disabled on text fields by default

    背景说明 最近在做一个 Elasticsearch 的分页查询,并且对查询结果按照特定字段进行排序的功能. 但是执行结果却报错,报错信息如下: { "error": { " ...

  7. String类型函数传递问题

    String类型函数传递问题 问题 以前没有注意过的一个问题, 最近在使用String类型作为函数入参的时候, 发现函数内对于String类型的改变并不会影响到外层调用对象本身; 结论 (先说结论) ...

  8. ASP.NET - Web API,从简单类型到复杂类型的参数传递用例,以及传递简单string类型的解决办法

    一,简单类型的传值 比如 public Users Get(int id) ,它可以使用两种方式获取: api/default/ $.get("/api/default",{id: ...

  9. String类型和包装类型作为参数传递时,是属于值传递还是引用传递呢?

    原理知识: 如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的.如果在函数中改变了副本的 值不会改变原始的值. 如果参数类型是引用类型,那 ...

随机推荐

  1. 贪心Crossing river

    英文题目: A group of N people wishes to go across a river with only one boat, which can at most carry tw ...

  2. A星寻路算法入门(Unity实现)

    最近简单学习了一下A星寻路算法,来记录一下.还是个萌新,如果写的不好,请谅解.Unity版本:2018.3.2f1 A星寻路算法是什么 游戏开发中往往有这样的需求,让玩家控制的角色自动寻路到目标地点, ...

  3. Bitcoin挖矿

    目录 为什么要挖矿? 比特币挖矿 为什么要挖矿? 增加恶意行为的成本 增加记账权力,获取相应的奖励 比特币挖矿 每开采210000个区块,挖矿奖励减半 2009年1月-2012年11月,奖励50BTC ...

  4. 20135220谈愈敏Blog1_计算机是如何工作的

    计算机是如何工作的 存储程序计算机工作模型 冯诺依曼体系结构 从硬件角度来看:CPU和内存,由总线连接,CPU中有一个名为IP的寄存器,总是指向内存的某一块:CS,代码段,执行命令时就取IP指向的一条 ...

  5. 新手上路 git你好

    天哪,虽然我是一个学计算机的,但是我发现我的计算机学的真是……好吧不说了,言归正传.​ 这几天一直在着手于git,可能只是学了一个皮毛,结果也是不大尽人意,跟着别人学了学,鼓捣了鼓捣,还是有点小小的收 ...

  6. 第二个spring冲刺第7天

    今天因为停电,所以没什么进展,延迟一天工作,今天当作休息

  7. Iterative Quantization,ITQ

    Abstract 针对大规模的图像检索问题,论文提出了一个高效的ITQ算法.该算法先将中心化后的数据映射到超立方体的顶点上,再通过优化过程寻找一个旋转矩阵,使得数据点经过旋转后,与超立方体的顶点数据具 ...

  8. OpenFlow 1.3 控制器与交换机的交互,以及拓扑发现

    前言 最近纠结于控制器如何发现拓扑,于是就翻起了OpenFlow 1.3进行查看,以及一些相关协议 OF 1.3 安全通道,即交互消息 OpenFlow Switch Specification 1. ...

  9. PAT 2016 数据的交换输出

    http://acm.hdu.edu.cn/showproblem.php?pid=2016 Problem Description 输入n(n<100)个数,找出其中最小的数,将它与最前面的数 ...

  10. [windows]转帖 windows 版本的含义

    1.N是None的意思,由于欧洲反垄断法不让系统捆绑浏览器ie和播放器.LTSB全称为Long Term Support Branch,意思为长期支持分支,是给Windows 10企业用户的一个更新选 ...