ASP.NET4.5Web API及非同步程序开发系列3
ASP.NET4.5Web API及非同步程序开发系列(3)
接着上一篇博客的内容做一个补充,正好是一个大哥提出来的,我们看看一个有趣的现象。
请求相关问题的补充:
我们先在Controller中的定义一个我们在前一篇博客中已经测试过的方法如下:

public class DemoController : ApiController
{
[HttpGet]
public HttpResponseMessage InsertPerson(string name,int age)
{
return this.Request.CreateResponse(HttpStatusCode.OK);
} [HttpGet]
public HttpResponseMessage InsertPlant(string name, int height)
{
return this.Request.CreateResponse(HttpStatusCode.OK);
}
}

经过上一篇文章的测试,使用Get api/Demo/InsertPseron?name=halower&age=18请求这个方法No problem !然后我们将其替换成[HttpPost]方式如下:

public class DemoController : ApiController
{
[HttpPost]
public HttpResponseMessage InsertPerson(string name,int age)
{
return this.Request.CreateResponse(HttpStatusCode.OK);
} [HttpPost]
public HttpResponseMessage InsertPlant(string name, int height)
{
return this.Request.CreateResponse(HttpStatusCode.OK);
}
}

现在我们开始操刀测试,结果情理之中,意料之外,注意的是我们在使用Fiddler测试的时候,请求头中需要添加:Content-Length:0,否则报错其它哦,当我们如下使用 Post api/Demo/InsertPseron请求时,发现根本找不到资源

可能你会这么认为是因为没有传入参数值,所以会找不到相应的Action,那么我们就截获它的请求给它传入参数值试试:

结果还是411,尝试失败了,这是因为WebAPI对于Get和Post的处理机制不一样,那么我们就尝试着解决这个问题
解决方法
方法一:使用DTO类进行数据的包装
我们将请求的数据分装成2个DTO类后进行对象的传递如下:

public class Person
{
public string Name { get; set; }
public int Age { get; set; }
} public class Plant
{
public string Name { get; set; }
public int Height { get; set; }
} public class DemoController : ApiController
{
[HttpPost]
public HttpResponseMessage InsertPerson(Person person)
{
return this.Request.CreateResponse(HttpStatusCode.OK);
} [HttpPost]
public HttpResponseMessage InsertPlant(Plant plant)
{
return this.Request.CreateResponse(HttpStatusCode.OK);
}
}

我们在测试一下:

结果是500,但是我们在Fidder的TextView中异常信息,发现找到了多个Action方法,毫不犹豫我们修要修改路由了

config.Routes.MapHttpRoute(
name: "",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { action = RouteParameter.Optional, id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new {id = RouteParameter.Optional }

修改后我们在测试一次试试,OK了:

方法二:使用FormCollection

using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Mvc; namespace WebAPI.Controllers
{
public class DemoController : ApiController
{
[System.Web.Http.HttpPost]
public HttpResponseMessage InsertPerson(FormCollection person)
{
return this.Request.CreateResponse(HttpStatusCode.OK);
} [System.Web.Http.HttpPost]
public HttpResponseMessage InsertPlant(FormCollection plant)
{
return this.Request.CreateResponse(HttpStatusCode.OK);
}
} }

测试结果:

注意:我们可能参考官方的模板,使用FromBodyAttribute,做出这样的错误(可以点击这里查看该问题的具体细节和解释):
[HttpPost]
public HttpResponseMessage InsertPerson([FromBody] string name,[FromBody]string age)
{
return this.Request.CreateResponse(HttpStatusCode.OK);
}
方法三:使用 Newtonsoft.Json.Linq命名空间下的中的 JObject

using Newtonsoft.Json.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http; namespace WebAPI.Controllers
{
public class DemoController : ApiController
{
[HttpPost]
public HttpResponseMessage InsertPerson(JObject person)
{
return this.Request.CreateResponse(HttpStatusCode.OK);
} [HttpPost]
public HttpResponseMessage InsertPlant(JObject plant)
{
return this.Request.CreateResponse(HttpStatusCode.OK);
}
} }

运行效果:

未完待续....之后将对oData的支持,多媒体支持,Jquery调用WEB API等进行笔记总结。
备注:我也是刚刚开始学习,参阅了很多前辈的文章,所以版权的归大家所有,不归本人所有,如果你喜欢本文的话,推荐共勉,谢谢!
ASP.NET4.5Web API及非同步程序开发系列3的更多相关文章
- ASP.NET4.5Web API及非同步程序开发系列
ASP.NET4.5Web API及非同步程序开发系列 认识ASP.NET WEB API 他的前身为WCF WEB API用于协助WCF支持RestFul.现在集成进ASP.NET,正式更名为ASP ...
- ASP.NET4.5Web API及非同步程序开发系列(1)
认识非同步程序开发设计模型 从VS2012开始引入的新的非同步程序设计的支持-------async/await设计模型 之前的当我们支持非同步作业的时候,往往使用多线程开解决,我们比较熟悉的就是 执 ...
- ASP.NET4.5Web API及非同步程序开发系列(2)
认识ASP.NET WEB API 他的前身为WCF WEB API用于协助WCF支持RestFul.现在集成进ASP.NET,正式更名为ASP.NET WEB API,ASP.NET Web API ...
- ASP.NET4.5Web API及非同步程序开发系列(3)
接着上一篇博客的内容做一个补充,正好是一个大哥提出来的,我们看看一个有趣的现象. 请求相关问题的补充: 我们先在Controller中的定义一个我们在前一篇博客中已经测试过的方法如下: public ...
- 微信小程序开发系列六:微信框架API的调用
微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 微信小程序开发系列四:微信小程序 ...
- 微信小程序开发系列七:微信小程序的页面跳转
微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 微信小程序开发系列四:微信小程序 ...
- WordPress版微信小程序开发系列(二):安装使用问答
自WordPress版微信小程序发布开源以来,受关注的程度超过我原来的想象.这套程序主要面对的用户是wordpress网站的站长,如果wordpress站想在微信的生态圈得到推广,小程序成为一种重要的 ...
- 微信小程序开发系列二:微信小程序的视图设计
大家如果跟着我第一篇文章 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 一起动手,那么微信小程序的开发环境一定搭好了.效果就是能把该小程序的体验版以二维码的方式发送给其他朋友使用. 这个系列 ...
- 【微信小程序开发•系列文章六】生命周期和路由
这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...
随机推荐
- SEO 优化,网站推广优化教程100条(SEO,网站关键字优化,怎么优化网站,如何优化网站关键字)
这篇文章不错. http://www.cnblogs.com/zangdalei/archive/2010/08/31/1814047.html 看了一半之后的,觉得不太靠谱,很多都不懂. 于是 找 ...
- 观察者模式的程序实例C++
一.什么是观察者模式 Observer模式也叫观察者模式,是由GoF提出的23种软件设计模式的一种.Observer模式是行为模式之中的一个,它的作用是当一个对象的状态发生变化时,可以自己主动通知其它 ...
- HTML5 Canvas简简单单实现手机九宫格手势密码解锁
原文:HTML5 Canvas简简单单实现手机九宫格手势密码解锁 早上花了一个半小时写了一个基于HTML Canvas的手势解锁,主要是为了好玩,可能以后会用到. 思路:根据配置计算出九个点的位置,存 ...
- windows socket 网络编程
样例代码就在我的博客中,包含六个UDP和TCP发送接受的cpp文件,一个基于MFC的局域网聊天小工具project,和此小工具的全部执行时库.资源和执行程序.代码的压缩包位置是http://www.b ...
- 移动客户端与服务端Session那点秘密
众所周知,做过Web开发的小伙伴可能知道,在浏览器向服务器发一个请求,服务器端会为当前的访问者创建一个session会话,随着浏览器的关闭而会话结束.但是移动客户端咋整呢(IOS/Android啥的) ...
- 伺服驱动器UVW电机电源线相序错误
我们有必要先了解此讨论的前提:编码器初始安装相位正确.伺服驱动器将全然"採信"电机编码器的初始安装相位所表征的电机电角度相位,无需在伺服电机 的UVW动力线接线连接后进行额外 ...
- Humming Bird A20 SPI2驱动编译
Humming Bird A20 SPI2使用编译 Yao.GUET 2014-07-17,请注明出处:http://blog.csdn.net/Yao_GUET A20上带有4个spi接口,因为Hu ...
- js判断浏览器类型(手机和电脑终端)
工作中经常会用到通过js来判断浏览器的功能!今天这里通过js来判断浏览器是来自移动设备还是pc设备! 代码如下: var browser={ versions:function(){ var u = ...
- 【PLSQL】过程procedure形参和参数
************************************************************************ ****原文:blog.csdn.net/clar ...
- 必须掌握的JavaScript基本知识
作为一个前端工作者,应该了解一些javascript的发展历史,javascript实现及版本等.基本概念包括语法.关键字.变量.数据类型.操作符.语句控制及函数等,它们和我们学习的其它语言C/C++ ...