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 的网站项目来支撑.注意,这里是 ...
随机推荐
- Nginx最大客户连接数算法一些遐想
Nginx最大客户连接数算法一些遐想 现在很多互联网公司都在使用nginx,并且替换掉以前的Apache,nginx的优点就不说了,浅聊两句nginx的某些配置参数,找到这些参数设置的目的和关联性,并 ...
- asp.net mvc View视图相关
1.0 @helper语法 @helper语法可以定义可重复使用的帮助器方法: 例如 @helper methodName(type paramName,...){ //todo } 调用:@meth ...
- 学C#之设计模式系列笔记(2)观察者模式
一.借鉴说明 1.<Head First Design Patterns>(中文名<深入浅出设计模式>) 2.维基百科,观察者模式,https://zh.wikipedia.o ...
- AutoMapper的介绍与使用(二)
AutoMapper的匹配 1,智能匹配 AutoMapper能够自动识别和匹配大部分对象属性: 如果源类和目标类的属性名称相同,直接匹配,不区分大小写 目标类型的CustomerName可以匹配源类 ...
- Android事件总线
Android中Activity.Service.Fragment之间的相互通信比较麻烦,主要有以下一些方法: (1)使用广播,发送者发出广播,接收者接收广播后进行处理: (2)使用Handler和M ...
- spring/spring boot/spring cloud开发总结
背景 针对RPC远程调用,都在使用dubbo.dubbox等,我们也是如此.由于社区暂停维护.应对未来发展,我们准备尝试新技术(或许这时候也不算什么新技术了吧),选择使用了spring ...
- springmvc4 mybatis 整合 框架源码 bootstrap
A集成代码生成器 [正反双向(单表.主表.明细表.树形表,开发利器)+快速构建表单 下载地址 ; freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类 ...
- 关于IOS中safari下的select下拉菜单,文字过长不换行的问题
今天遇到下图这种问题,文字过长,显示不全.折腾了老半天,在网上搜了半天也找不到解决方案. 于是问了下同事,同事提到了<optgroup>,这个标签厉害. <optgroup> ...
- Web Worker javascript多线程编程(一)
什么是Web Worker? web worker 是运行在后台的 JavaScript,不占用浏览器自身线程,独立于其他脚本,可以提高应用的总体性能,并且提升用户体验. 一般来说Javascript ...
- ASP.Net MVC数据传递
今天做了个项目,涉及到离线下载HTML,没有前后台交互,没有Ajax,JavaScript,只有第一次从控制器带参数进入,一次读取到页面所需要的全部数据,使用Razor语法绑定到前台页面,在做这个项目 ...