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站想在微信的生态圈得到推广,小程序成为一种重要的 ...
- 微信小程序开发系列二:微信小程序的视图设计
大家如果跟着我第一篇文章 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 一起动手,那么微信小程序的开发环境一定搭好了.效果就是能把该小程序的体验版以二维码的方式发送给其他朋友使用. 这个系列 ...
- 【微信小程序开发•系列文章六】生命周期和路由
这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...
随机推荐
- 通信网Project之——单源单宿最短路问题
最主要的Vertex类: #ifndef VERTEX_H #define VERTEX_H #include <climits> #include <cstddef> #de ...
- 深入理解C指针之六:指针和结构体
原文:深入理解C指针之六:指针和结构体 C的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结 ...
- POJ 1182(食物链-另类做法【拆点】)[Template:并查集]
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 46039 Accepted: 13400 Description ...
- how tomcat works 读书笔记九 Session管理
在看本文之前,请先查阅相关Session与Cookie的资料. 这篇资料不错 http://blog.csdn.net/fangaoxin/article/details/6952954 Catali ...
- JAVA学习篇--Java类加载
由来: 与普通程序不同的是,Java程序(class文件)并非本地的可执行程序(解释性语言). 当执行Java程序时.首先执行JVM(Java虚拟机),然后再把Javaclass载入到JVM里头执行, ...
- leetcode[71] Sqrt(x)
题目,就是实现一个开方,返回是整数.int sqrt(int x) 用二分法,因为一个数的开方肯定小于 x/2 + 1, 因为小于5的某些数的开方并不一定比x/2小,所以要+1,那么们定义一个left ...
- LinQ—扩展方法
概述 本节主要解说扩展方法,涉及LinQ的详细知识不多. 扩展方法的描写叙述 .net framework为编程人员提供了非常多的类,非常多的方法,可是,不论.net framework在类中为我们提 ...
- ACdream 1195 Sudoku Checker (暴力)
Sudoku Checker Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) Submi ...
- 百度地图SDK for Android v2.1.3全新发布
2013年8月1日 Android SDK:V2.1.3产品上线 新增: 增加短串分享接口(poiDetailShareURLSearch.poiRGCShareURLSearch) 驾车路线检索增加 ...
- 推荐一个比较好的VBS编辑器
QTP 本身的IDE环境, 有诸多缺陷.所以,一般中级以上的自动化测试工程师都会采用外部其他编辑器来编辑VBS脚本.通常情况下,一般都 notepad++. 但是,notepad++也是有很多不足之处 ...