• 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等进行笔记总结。

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

     
     
  • 相关阅读:
    编程随想——从基础开始,顺其自然
    多个SSH私钥配置不当导致Git push 失败的分析及解决方法
    VPS配置记录
    COCI 2010.03.06 T5「PROGRAM」题解
    筛素数
    你的第一个程序--基本输入输出介绍,头文件介绍
    入门指北目录
    尺取法
    HAOI2006 (洛谷P2341)受欢迎的牛 题解
    c++并查集配合STL MAP的实现(洛谷P2814题解)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3207647.html
Copyright © 2020-2023  润新知