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

请求相关问题的补充:

我们先在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等进行笔记总结。

     备注:我也是刚刚开始学习,参阅了很多前辈的文章,所以版权的归大家所有,不归本人所有,如果你喜欢本文的话,推荐共勉,谢谢!

最新文章

  1. LL LR SLR LALR 傻傻分不清
  2. Xcode LLDB Debug教程
  3. JavaScript闭包示例
  4. [King.yue]EXT.Grid行双击事件
  5. 常用排序算法集合-C实现
  6. 网页JavaScript3
  7. 为SQL Server 增加链接到SQL Server 的链接服务器
  8. Unity3D 浏览工具
  9. MongoDB的mongos实例因无法分配mlock内存挂掉
  10. UNIX网络编程——带外数据
  11. css3实现水平垂直居中
  12. Linux命令、脚本
  13. 【转载】 C#往文件中追加文本内容信息
  14. 2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛题解
  15. 拟物设计和Angular的实现 - Material Design
  16. HDU 1548 A strange lift (Dijkstra)
  17. python的print
  18. 【codeforces 765F】 Souvenirs
  19. django rest_framework 框架的使用03
  20. CAS中的ABA问题

热门文章

  1. ORB-SLAM(一)简介
  2. Ubuntu/Mint更换阿里云源
  3. VMware安装ubuntu虚拟机
  4. 业务中是否有必要让所有的ViewController统一继承抽象类
  5. <<< 将一个rar格式的文件变成一张jpg图片,按照后缀来选择打开他的模式
  6. CSS-border属性制作小三角
  7. R读取溢出的数据
  8. 暴力枚举N级子域名
  9. ANT的安装
  10. [Machine Learning & Algorithm] 随机森林(Random Forest)