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的更多相关文章

  1. ASP.NET4.5Web API及非同步程序开发系列

    ASP.NET4.5Web API及非同步程序开发系列 认识ASP.NET WEB API 他的前身为WCF WEB API用于协助WCF支持RestFul.现在集成进ASP.NET,正式更名为ASP ...

  2. ASP.NET4.5Web API及非同步程序开发系列(1)

    认识非同步程序开发设计模型 从VS2012开始引入的新的非同步程序设计的支持-------async/await设计模型 之前的当我们支持非同步作业的时候,往往使用多线程开解决,我们比较熟悉的就是 执 ...

  3. ASP.NET4.5Web API及非同步程序开发系列(2)

    认识ASP.NET WEB API 他的前身为WCF WEB API用于协助WCF支持RestFul.现在集成进ASP.NET,正式更名为ASP.NET WEB API,ASP.NET Web API ...

  4. ASP.NET4.5Web API及非同步程序开发系列(3)

    接着上一篇博客的内容做一个补充,正好是一个大哥提出来的,我们看看一个有趣的现象. 请求相关问题的补充: 我们先在Controller中的定义一个我们在前一篇博客中已经测试过的方法如下: public ...

  5. 微信小程序开发系列六:微信框架API的调用

    微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 微信小程序开发系列四:微信小程序 ...

  6. 微信小程序开发系列七:微信小程序的页面跳转

    微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 微信小程序开发系列四:微信小程序 ...

  7. WordPress版微信小程序开发系列(二):安装使用问答

    自WordPress版微信小程序发布开源以来,受关注的程度超过我原来的想象.这套程序主要面对的用户是wordpress网站的站长,如果wordpress站想在微信的生态圈得到推广,小程序成为一种重要的 ...

  8. 微信小程序开发系列二:微信小程序的视图设计

    大家如果跟着我第一篇文章 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 一起动手,那么微信小程序的开发环境一定搭好了.效果就是能把该小程序的体验版以二维码的方式发送给其他朋友使用. 这个系列 ...

  9. 【微信小程序开发•系列文章六】生命周期和路由

    这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...

随机推荐

  1. MVC扩展ModelBinder使类型为DateTime的Action参数可以接收日期格式的字符串

    原文:MVC扩展ModelBinder使类型为DateTime的Action参数可以接收日期格式的字符串 如何让视图通过某种途径,把符合日期格式的字符串放到路由中,再传递给类型为DateTime的控制 ...

  2. springbatch操作CSV文件

    一.需求分析 使用Spring Batch对CSV文件进行读写操作: 读取一个含有四个字段的CSV文件(id, name, age, score), 对文件做简单的处理, 然后输出到还有一个csv文件 ...

  3. thinkphp 支付宝错误 Class 'Think' not found

    Class 'Think' not found D:\www\DonatePlatform\ThinkPHP\Extend\Vendor\alipay\lib\alipay_submit.class. ...

  4. mongodb group包(最具体的、最受欢迎、最容易理解的解释)

    和数据库一样group经常常使用于统计.MongoDB的group还有非常多限制,如:返回结果集不能超过16M, group操作不会处理超过10000个唯一键.好像还不能利用索引[不非常确定]. Gr ...

  5. 求最短路径算法之SPAF算法。

    关于求最短路径: 求最短路径的算法有许多种,除了排序外,恐怕是OI界中解决同一类问题算法最多的了.最熟悉的无疑是Dijkstra(不能求又负权边的图),接着是Bellman-Ford,它们都可以求出由 ...

  6. 常用在网站上的30个jQuery插件

    jQuery插件是网页设计师最喜欢的.从图像滑块,图像画廊和导航插件,它们是如此众多,如此多样,如此惊人的和互动可以制作美化网站.在本文的在30个插件中,我认为必须在网站建设时用到.当然你现在可能不善 ...

  7. WEB项目(B/S系统)打包安装(总结篇)

    原文:WEB项目(B/S系统)打包安装(总结篇) 打包安装程序的制作选择性还很多的,有installshield,wise installer,inno setup这几个做打包安装项目都是很强大的,要 ...

  8. Android的FrameLayout使用要注意的问题

    帧布局FrameLayout在Android的五大布局中是最简单的布局方式,在需要布局中的控件有重叠的情况下才使用. 今天Shamoo使用FrameLayout的时候,发现布局里面的控件设置layou ...

  9. SVN服务器搭建(2)

    转自:http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407979.html 上一篇介绍了VisualSVN Server和Tortois ...

  10. Step one : 熟悉Unix/Linux Shell 常见命令行 (二)

    2.学会使用一些文本操作命令 sed -- stream editor 1. Sed简介sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pat ...