ASP.NET - Web API,从简单类型到复杂类型的参数传递用例,以及传递简单string类型的解决办法
一,简单类型的传值
比如 public Users Get(int id) ,它可以使用两种方式获取:
- api/default/
- $.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的问题本身,而作此文。
ASP.NET - Web API,从简单类型到复杂类型的参数传递用例,以及传递简单string类型的解决办法的更多相关文章
- ASP.NET Web API 配置返回的json字段的格式以及Action返回HttpResponseMessage类型和IHttpActionResult类型
1. 对于返回的Json对象格式是以“帕斯卡”风格的(例如“FirstName”),然而我们的Api有很大的可能被带有Javascript的客户端消费,对于JS开发者来说可能更适合“驼峰”风格(例如” ...
- ASP.NET Web API 路由对象介绍
ASP.NET Web API 路由对象介绍 前言 在ASP.NET.ASP.NET MVC和ASP.NET Web API这些框架中都会发现有路由的身影,它们的原理都差不多,只不过在不同的环境下作了 ...
- 剖析Asp.Net Web API路由系统---WebHost部署方式
上一篇我们剖析了Asp.Net路由系统,今天我们再来简单剖析一下Asp.Net Web API以WebHost方式部署时,Asp.Net Web API的路由系统内部是怎样实现的.还是以一个简单实例开 ...
- 剖析Asp.Net Web API中HttpController的激活
在Asp.Net Web API中,请求的目标是定义在某个HttpController中的某个Action方法.当请求经过Asp.Net Web API消息处理管道到达管道"龙尾" ...
- ASP.NET Web API路由系统:路由系统的几个核心类型
虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...
- ASP.NET Web API框架揭秘:路由系统的几个核心类型
ASP.NET Web API框架揭秘:路由系统的几个核心类型 虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分 ...
- 开始一个简单的ASP.NET Web API 2 (C#)
创建一个Web API 项目 在本教程中,你将使用ASP.NET Web API 来创建一个web API 并返回产品列表. 网页前端使用jQuery 显示结果. 选择ASP.NET Web Appl ...
- ASP.NET Web API 2 媒体类型格式化程序
Ø 简介 在之前的ASP.NET Web API 2 消息处理管道文章中有提到,在 Web API 的生命周期中,还包含比较中要的一部分,就是媒体类型格式化程序,该程序主要用于处理 Web API ...
- 通过Knockout.js + ASP.NET Web API构建一个简单的CRUD应用
REFERENCE FROM : http://www.cnblogs.com/artech/archive/2012/07/04/Knockout-web-api.html 较之面向最终消费者的网站 ...
- 支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示
随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Angularjs的框架来做UI,而数据则由另一个Web Api 的网站项目来支撑.注意,这里是 ...
随机推荐
- 使用 Windows Phone Toolkit 的 Tilt 效果
上一篇文章分享了如何使控件具有摁下的效果(在WindowsPhone中使控件具有Tilt效果),实现方式是在项目中添加新的类文件,其实,如果项目引用了Windows Phone Toolkit,那么就 ...
- LCS记录
如题:求两个序列的最长公共序列.(如:"ABCBDAB"与"BCDB"最长公共序列为"BCDB")代码如下: #define MAX_SIZ ...
- WriteLog
public class WriteLog { /// <summary> /// 创建日志文件 /// </summary& ...
- 使用SignalR实现服务端消息推送
概述 这篇文章参考的是Server Broadcast with SignalR 2这篇教程,很不错的一篇教程,如果有兴趣的话可以查看原文,今天记录下来作为一个学习笔记,这样今后翻阅会更方便一点. 这 ...
- PHP 策略模式
策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.策略模式把对象本身和运算规则区分开来,其功能非常强大,因为这个设计模式本身的核心思想 ...
- CentOS7安装NodeJS6.9
1.下载 wget https://nodejs.org/dist/v6.9.2/node-v6.9.2-linux-x64.tar.xz 2.解压 tar -xJf node-v6.9.2-linu ...
- Linux 学习
远程登录Linux(05) 文本方式远程: putty SecureCRT winSCP SshClient图形方式远程:Xmanager Xming ifconfigps -ef | gr ...
- Dynamics CRM 之ADFS 使用 WID 和代理的联合服务器场
为此部署拓扑 Active Directory 联合身份验证服务 (AD FS) 等同于联合服务器场与 Windows 内部数据库 (WID) 拓扑中,但它将代理服务器计算机添加到外围网络,以支持外部 ...
- iOS开发--弹窗多选、单选框架
最近刚毕业...因为个毕设,都离职了又得重新找工作了,这是之前自己没事开直播写的一个小框架,后来各种趋于稳定后,简单的封装了下,写了个小demo,这里就不废话了,直接贴地址,也不编辑了,自己复制过去看 ...
- javaScript对象-基本包装类型的详解
本人按书上的内容大致地把javaScript对象划分成“引用类型”.“基本包装类型”和“内置对象”三块内容. 我们这篇先了解下基本包装类型的详细用法吧! 一.我们先解下相关概念: 1.引用类型的值(对 ...