实战 ASP.NET MVC Web API

Web API 框架基于 ASP.NET MVC 框架开发,是一个面向 Http 协议的通信框架。相对于 WCF 而言,Web API 只面向于 Http 协议设计,而且没有 WCF 那么繁琐的配置。相对于直接使用 ASP.NET MVC 来返回 Json 对象的方式而言,Web API 封装了数据的序列化、反序列化,接口、实现都更加简单。 
简单地说,如果要向浏览器、移动端提供 Json 数据格式的 API,则应该首选 Web API 作为通信框架。

以下,我列出了在当前使用 Web API 开发系统时,遇到的几个知识点或问题。

数据序列化


Web API 框架目前支持两种数据格式的序列化:Json 及 Xml。在不做任何配置的情况下,如果 Http 请求中,HttpHeader 中 Accept 被指定为 accept: application/xml,则 Web API 会自动把数据使用 xml 进行序列化,否则使用 json 序列化。 
如果期望不使用 xml 序列化数据,我们可以通过 GlobalConfiguration.Configuration.Formatters 来进行配置:config.Formatters.Remove(config.Formatters.XmlFormatter)。

一般情况下,我们会使用 Json 序列化。跟 ASP.NET MVC 的 Json 序列化不同的是,Web API 使用了 Newtonsoft.Json 框架来进行序列化。(例如,JsonMediaTypeFormatter.SerializerSettings 属性就是 Newtonsoft.Json.JsonSerializerSettings 类型,可以直接对序列化进行配置。) 
Json 序列化支持对匿名类型进行进行序列化,这大大方便了开发人员,例如,我们可以随意组装数据并直接返回:

   1:  [HttpGet]
   2:  public IEnumerable AllGet()
   3:  {
   4:      return new string[] { "Item1", "Item2" }.Select(s => new
   5:      {
   6:          Name = s,
   7:          Code = s,
   8:          Items = new ArrayList
   9:          {
  10:              new { Name = "Item1" },
  11:              new { Name = "Item2" },
  12:              new { Name = "Item3" },
  13:              new { Name = "Item4" },
  14:          }
  15:      });
  16:  }

另外,Web API 提供了 HttpResponseMessage 类型可作为返回值,使得开发人员可以对 HttpResponse 做一些更详细的设置。而且,如果不期望修改返回值类型而直接返回 HttpResponse 时,可以使用 HttpResponseException 间接返回一个 HttpResponseMessage。

Action 匹配


Web API 框架默认是基于 Restful 架构模式的,与 ASP.NET MVC 有区别的是,它会根据 Http 请求的 HttpMethod(Get、Post、Put、Delete) 来在 Controller 中查找 Action,规则是:Action 名中是否以 Get、Post 开头?Action 上标记 HttpGet、HttpPost 等标记?并会完全忽视 Action 的方法名。

例如,Web API 对于资源的 CRUD 操作,采用如下格式: 
get /API/models/ 查询所有实体 
get /API/models/1000 查询id为1000的实体 
post /API/models/ {id:-1, name:'name'} 添加一个实体 
put /API/models/ {id:1000, name:'name'} 更新指定实体 
delete /API/models/1 删除指定实体

由于忽视了方法名,所以的几个方法,在调用时会抛出异常: 

在面向服务的架构中,往往不会直接把底层的实体公布出来,让客户端直接进行 CRU 操作;而是公布一些粗粒度的 RPC 形式的服务操作。要使用 Web API 框架,我们需要修改默认的配置。例如,让客户端在调用时显式指定 action 名称:

   1:  config.Routes.MapHttpRoute(
   2:      name: "DefaultApi",
   3:      routeTemplate: "api/{controller}/{action}/{id}",
   4:      defaults: new { id = RouteParameter.Optional }
   5:  );

这样,由于显式指定了 Action 名称,Web API 会使用该名称来查找对应的 Action 方法,而不再按照 HttpMethod 约定来查找对应的 Action。例如,对于以下 API 的调用如下:

   1:  [HttpGet]
   2:  public HttpResponseMessage Login(string userName, string password)
   3:  {
   4:      return Request.CreateResponse(HttpStatusCode.NotFound);
   5:  }

调用方法: 
get /api/account/login/?username=hqf@qq.com&password=dsd

关于 POST 参数绑定


Web API 相对于 ASP.NET MVC,使用了新的参数绑定类。要注意的是,Action 参数列表中只能有一个参数可以从 Http Post Body 中反序列化出来。如果参数列表中只有一个参数,而且它的类型是一个复杂类型,那么 Web API 会直接把 Body 尝试反序列化为该类的对象。如果有多个参数,那么要从 Body 反序列化的那个参数,需要标记上 [FromBodyAttribute]。 
相关内容,比较复杂,可以参考以下文章: 
http://www.tuicool.com/articles/eQzyEv 
http://weblogs.asp.net/cibrax/archive/2012/08/10/binding-form-data-in-asp-net-web-api.aspx

不错的示例代码


MSDN 上有一个比较全面的示例代码: 
http://code.msdn.microsoft.com/ASPNET-Web-API-JavaScript-d0d64dd7

本文讲得比较浅,只是列举一些开发过程中会经常遇到的需要注意的点。解决这些问题后,我们的系统,已经开始使用 Web API 来进行开发了。

实战 ASP.NET MVC Web API的更多相关文章

  1. ASP.NET MVC Web API Post FromBody(Web API 如何正确 Post)

    问题场景: ASP.NET MVC Web API 定义 Post 方法,HttpClient 使用 JsonConvert.SerializeObject 传参进行调用,比如 Web Api 中定义 ...

  2. ASP.NET MVC Web API For APP

    近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过在浏览器中使用 JavaScr ...

  3. [译]ABP框架使用AngularJs,ASP.NET MVC,Web API和EntityFramework构建N层架构的SPA应用程序

    本文转自:http://www.skcode.cn/archives/281 本文演示ABP框架如何使用AngularJs,ASP.NET MVC,Web API 和EntityFramework构建 ...

  4. 【转载】ASP.NET MVC Web API 学习笔记---联系人增删改查

    本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查.目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的.下面我们通过创建一个简单的Web API来管理联系 ...

  5. Asp.net mvc web api 在项目中的实际应用

    Asp.net mvc web api 在项目中的实际应用 前言:以下只是记录本人在项目中的应用,而web api在数据传输方面有多种实现方式,具体可根据实际情况而定! 1:数据传输前的加密,以下用到 ...

  6. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  7. ABP 教程文档 1-1 手把手引进门之 AngularJs, ASP.NET MVC, Web API 和 EntityFramework(官方教程翻译版 版本3.2.5)含学习资料

    本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 转载请注明出处:http://www.cnblogs.com/yabu007/  谢谢 官方文档分四部分 一. 教程文档 二.ABP 框架 三. ...

  8. ASP.NET MVC Web API 学习笔记---联系人增删改查

    本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查. 目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的. 下面我们通过创建一个简单的Web API来管理 ...

  9. 【转载】ASP.NET MVC Web API 学习笔记---第一个Web API程序

    1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过 ...

随机推荐

  1. Java泛型解析(03):虚拟机运行泛型代码

    Java泛型解析(03):虚拟机运行泛型代码      Java虚拟机是不存在泛型类型对象的,全部的对象都属于普通类,甚至在泛型实现的早起版本号中,可以将使用泛型的程序编译为在1.0虚拟机上可以执行的 ...

  2. Hack 语言学习/参考---1.1 What is Hack?

    What is Hack?¶ Hack is a language for HHVM that interopates seamlessly with PHP. The barrier to entr ...

  3. [LeetCode]Copy List with Random Pointer &Clone Graph 复杂链表的复制&图的复制

    /** * Definition for singly-linked list with a random pointer. * struct RandomListNode { * int label ...

  4. 远程调用之RMI技术

    ---恢复内容开始--- RMI已经不是什么新的技术了,但是相对于webservice来说,rmi比较简单,比较适合一些小的应用,下面的helloword列子可以介绍rmi的相关技术 服务器端代码: ...

  5. Asp.Net MVC4 + Oracle + EasyUI + Bootstrap

    Asp.Net MVC4 + Oracle + EasyUI + Bootstrap --操作数据和验证 本文链接:http://www.cnblogs.com/likeli/p/4234238.ht ...

  6. Codeforces 484B Maximum Value(高效+二分)

    题目链接:Codeforces 484B Maximum Value 题目大意:给定一个序列,找到连个数ai和aj,ai%aj尽量大,而且ai≥aj 解题思路:类似于素数筛选法的方式,每次枚举aj,然 ...

  7. MonkeyRunner源码分析之工作原理图-attach

    花了点时间整理了下MonkeyRunner的工作原理图: Item Description Warning Author 天地会珠海分舵 转载请注明出处! Blog Address http://bl ...

  8. 【Android开发日记】第一个任务Android Service!Service靴+重力感应器+弹出窗口+保持执行

    前言: 近期在写一个小程序,需求是手机摇一摇就弹窗出来.第一次使用了Service,学习了两天,实现了Service弹窗,开机启动,Service启动和销毁,Service保持一直执行. 满足了自己的 ...

  9. 苹果iOS苹果公司的手机用户都有权索赔

    大家知道.手机中的操作系统(基础软件)存储在手机固(firm,ware)之中,一般而言,手机用户自己是不能修改的. 苹果iOS手机的系统后门(服务程序)也存储在手机固件之中.手机用户自己是无法删除的. ...

  10. 快速构建Windows 8风格应用30-应用生命周期管理

    原文:快速构建Windows 8风格应用30-应用生命周期管理 引言 Windows 8 中可以启动多个应用并在其中切换,我们没有必要担心降低系统速度或消耗电池电量. 因为系统会自动挂起(有时会终止) ...