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等进行笔记总结。
备注:我也是刚刚开始学习,参阅了很多前辈的文章,所以版权的归大家所有,不归本人所有,如果你喜欢本文的话,推荐共勉,谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?