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

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

参考页面:http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api;http://qingqingquege.cnblogs.com/p/5933752.html;https://docs.microsoft.com/zh-cn/aspnet/mvc/overview/releases/how-to-upgrade-an-aspnet-mvc-4-and-web-api-project-to-aspnet-mvc-5-and-web-api-2

时间: 2024-12-18 21:02:08

ASP.NET4.5Web API及非同步程序开发系列(3)的相关文章

【微信小程序开发?系列文章六】生命周期和路由

这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程序开发•系列文章四]模块化 [微信小程序开发•系列文章五]主界面 [微信小程序开发•系列文章六]生命周期和路由 整个微信小程序从打开到关闭,整个过程可以分为很多阶段或者说状态,这一整段的过程,我们称之为小程序的生命周期.而周期中的每种不同的状态,到另一个状态的过度和转化,是需要一个触发机制的,这种机

微信程序开发系列教程(二)使用JavaScript给微信用户发送消息

我之前的文章 微信程序开发系列教程(一)开发环境搭建 介绍了微信开发环境的搭建,这篇文章我们就来一步步开发一些具体的功能. 功能需求:当有微信用户关注了您的公众号之后,您用JavaScript发送一个欢迎消息给这个粉丝. 具体实现 我们登陆微信公众号的控制台后,点开发-> 基本配置: 能看到我们配置的微信消息服务器的地址.在我第一篇教程里讲到,我们在本地用nodejs开发一个Web服务器,然后部署到您喜欢的云平台,比如腾讯云,阿里云,百度云等等(我选的是云平台Heroku),然后把部署后应用的u

Asp.Net Web API 2 官网菜鸟学习系列导航[持续更新中]

前言 本来一直参见于微软官网进行学习的, 官网网址http://www.asp.net/web-api.出于自己想锻炼一下学习阅读英文文章的目的,又可以学习下微软新发布的技术,其实也很久了,但自己菜鸟一枚,对自己来说都是新技术了.鉴于以上两个原因,本人打算借助google翻译和有道词典,来翻译学习这个系列,并通过博客园来记录自己的翻译学习过程.由于自己阅读水平的确太菜,在借助工具的情况下,有时候搞出来的也是蹩脚的语句,自己读着都难受,尤其是到了Web API路由的那两篇,所以自己想着是不是有别人

ASP.NET Web API实现微信公众平台开发(一)

最近朋友的微信公众号准备做活动,靠固定的微信公众平台模版搞定不了,于是请我代为开发微信后台.鉴于我也是第一次尝试开发微信后台,所以也踩了不少坑,此系列博客将会描述微信公众号各项功能的实现. 先决条件 1.一台可部署web服务的服务器或者云平台(我采用的是Microsoft Azure) 2.一个可以正常使用的微信公众账号 3.Visual Studio 开发准备 1.采用ASP.NET Web API网站项目作为微信公众号后台服务 成为微信公众号开发者 这一步很简单,只要在微信公众号后台的开发者

微软代码示例:ASP.NET 2.0 三层架构应用程序教程系列

本文转自:http://www.codeusing.com/hi/uephee.wen/resource/view/170.aspx 资源分类:微软代码示例               更新日期:2008-10-11 主页:http://msdn.microsoft.com/en-us/library/aa581769.aspx 语言:英文  授权形式:免费 微软 Scott Mitchell 为大家准备的 ASP.NET 2.0 三层架构应用程序系列教程,共35讲,分别有C#和VB.NET版本

微信程序开发系列教程(三)使用微信API给微信用户发文本消息

这个系列的第二篇教程,介绍的实际是被动方式给微信用户发文本消息,即微信用户关注您的公众号时,微信平台将这个关注事件通过一个HTTP post发送到您的微信消息服务器上.您对这个post请求做了应答(格式为文本),则该应答会通过微信平台投递到您粉丝的微信应用上. 微信开发者中心的文档将这种行为称为"被动回复用户消息": 回复消息报文的格式在开发者文档里也有清晰的定义,是一个xml格式的字符串.我的第二篇教程里也有具体的发送该报文的代码示例. 本文作为这个开发系列的第三篇教程,介绍的是如何

微信小程序开发系列一:微信小程序的申请和开发环境的搭建

我最近也刚刚开始微信小程序的开发,想把我自学的一些心得写出来分享给大家. 这是第一篇,从零开始学习微信小程序开发.主要是小程序的注册和开发环境的搭建. 首先我们要在下列网址申请一个属于自己的微信小程序: https://mp.weixin.qq.com/cgi-bin/wx 点击按钮"前往注册".注意我们需要使用一个没有注册过微信小程序或者微信公众号的邮箱.我用的是网易邮箱.注册之后,邮箱会收到一封激活邮件. 激活之后,就可以进入小程序主体信息登记页面了.这里需要使用×××号码和手机验

裴东辉-如何使用新浪微博API开放平台进行程序开发http://www.cnblogs.com/dhsunny/p/3578399.html?utm_source=tuicool&utm_medium=referral

前段时候抓取微博的数据,想着自己使用htmlunit来模拟登陆新浪微博来抓取数据,这两天看了新浪微博的官方API,发现通过新浪微博的官方API 来获取新浪微博信息,更全面,更简单.下面就从注册新浪微博,到在新浪微博开放平台上面完善开发者信息,然后创建应用,从而获取Access Token,最后开发自己的应用程序. 1注册126邮箱 02注册新浪微博 03登陆新浪微博 04登陆新浪开放平台 05查看微博API 06可以看到有获取用户关注的用户信息列表 07打开api测试工具 08创建应用获取Acc

新浪微博API开放平台进行程序开发第一步(java)

申请开发者权限步骤: 1.登录sina微博,点击“应用” 2.点击“微博开发平台 我也要做开发者” 3.点击“我的应用”,填写“开发者信息” 4.点击“创建应用”,就是你将要开发的微博应用程序,可以是电脑客户端,微博推广,手机客户端等. 没有个人网站接入,也不是进行手机开发,做一个毕设的pc端小程序. 5.获取App Key, App Secret 6.下载SDK,针对不同的开发,有不同语言版本,链接:http://open.weibo.com/wiki/SDK#Python_SDK 就是一个工