博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET4.5Web API及非同步程序开发系列(3)
阅读量:5819 次
发布时间:2019-06-18

本文共 3921 字,大约阅读时间需要 13 分钟。

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

请求相关问题的补充:

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

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

 

 

转载于:https://www.cnblogs.com/rohelm/p/3207430.html

你可能感兴趣的文章
Mysql基准测试
查看>>
Session 撰改演示
查看>>
【转】python3 发邮件实例(包括:文本、html、图片、附件、SSL、群邮件)
查看>>
事务隔离级别(图文详解)
查看>>
canvas系列教程08-canvas各种坑
查看>>
浅析package.json中的devdependencies 和 dependencies
查看>>
又一个 iOS 侧边栏组件: SideMenu
查看>>
vue.js 打包遇到的问题
查看>>
【译】更优秀的GraphQL官方中文文档-客户端如何使用
查看>>
git pull遇到的问题
查看>>
eclipse下maven spring项目环境配置
查看>>
无缝轮播
查看>>
CTS失败项分析(2)android.telephony.cts.VisualVoicemailServiceTest#testFilter_data
查看>>
三分钟,轻松了解Dapp
查看>>
GMQ交易平台满足不同客户群体的多种投资需求
查看>>
大数据开发如何入门你必须知道这些
查看>>
关于js(es5)如何优雅地创建对象
查看>>
阿里云前端周刊 - 第 28 期
查看>>
iOS 主队列同步造成死锁的原因
查看>>
es6 下比较对象是否有修改的简要方法
查看>>