接着上一篇博客的内容做一个补充,正好是一个大哥提出来的,我们看看一个有趣的现象。

请求相关问题的补充:

我们先在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. 微信小程序开发系列六:微信框架API的调用

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

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

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

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

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

  4. 微信小程序开发系列 (四) :微信小程序的页面跳转路由设计

    笔者由于工作需要,曾经参加过一个微信小程序同 SAP 系统集成的项目,因此从零开始学习了微信小程序的开发知识.这里通过系列文章把自己所学分享出来,希望对相关学习者有所帮助. 本教程前面三篇文章: 微信 ...

  5. Jerry Wang的微信小程序开发系列文章

    微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列教程三:微信小程序的调试方法 微信小程序开发系列四:微信小程序之控制器的初始化逻辑 ...

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

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

  7. 微信程序开发系列教程(二)微信订阅号+人工智能问答服务

    我的前一篇文章**微信程序开发系列教程(一)**开发环境搭建 已经介绍了微信服务器的开发环境搭建.本文作为开发系列的第二篇文章,介绍如何给您的微信订阅号开发一个最简单的问答服务,非常好玩. 这个系列的 ...

  8. 【微信小程序开发•系列文章一】入门

    本系统文章主要有以下几篇: <[微信小程序开发•系列文章一]入门> <[微信小程序开发•系列文章二]视图层> <[微信小程序开发•系列文章三]数据层> <[微 ...

  9. 《基于Windows 7特性的程序开发系列》视频分享

    前一阵录制了<基于Windows 7特性的程序开发系列>视频课程,主要针对WinForm.WPF 开发具有Windows 7 特性的程序.现已发布到MSDN Webcast 欢迎大家拍砖. ...

最新文章

  1. 深入研究自监督单目深度估计:Monodepth2
  2. 【转】摄像头编程实例
  3. idea下org.apache.commons.dbcp.BasicDataSourc找不到
  4. 今年电子设计竞赛取消了?
  5. LeetCode 929. 独特的电子邮件地址
  6. 华为模拟器ensp代码错误2,41,40问题的解决
  7. 失去老罗,张一鸣的坚果手机多了什么?
  8. 【ZJCPC2019 第16届 浙江省赛】The 16th Zhejiang Provincial Collegiate Programming Contest(GFHIJ 5题)
  9. 西门子S7系列中间人攻击:PLC探测和流量分析(二)
  10. python numpy 里面的[:, None]是个什么鬼?[..., None]呢?
  11. 【VS】Installer Projects生成英文安装包
  12. mysql权限管理命令小结
  13. teraterm 执行sql_tera term通过ttl脚本 自动连接服务器
  14. [2]十道算法题【Java实现】
  15. 使用recycleview 实现viewpager 功能,并带有指示器。(仿高德交通路线规划实现)
  16. 第一天-1-markdown笔记学习
  17. 802.1X与portal的无线认证
  18. gvim之Vimdiff 使用
  19. 计算机丢失CH375DLL怎么办,CH375DLL.DLL
  20. android 源码编译 模拟器emulator启动,Android 源码 (AOSP) - 编译 ( 模拟器 )

热门文章

  1. 波特率_不同波特率CAN总线系统如何进行数据收发
  2. oracle 空间数据处理,Oracle数据库空间数据的处理
  3. mongodb启动成功连不上_MySQL数据导入到MongoDb教程
  4. python24.dll_2_48_python24.dll
  5. hilbert变换_希尔伯特变换 matlab实现
  6. 计算机科学 在职双证,计算机专业在职研究生如何获得双证?
  7. flink 写kafka_网易云音乐基于 Flink + Kafka 的实时数仓建设实践
  8. 导入第三方组件_大型 web 应用公共组件架构是如何来的?
  9. boot jndi数据源 spring_spring boot多数据源配置(mysql,redis,mongodb)实战
  10. 内地计算机科技学校,23所内地顶尖高校盘点!计算机学科哪家强?