SOAP Web API采用RPC风格,它采用面向功能的架构,所以我们在设计SOAP Web API的时候首相考虑的是应高提供怎样的功能(或者操作)。
RESTful Web API采用面向资源的架构,所以在设计之初首先需要考虑的是有哪些资源可供操作。
RESTful是一种软件架构风格,提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制,它将分布在网络中某个节点中的资源通过URI进行标识,客户端应用通过URI来获取资源的表征,获得这些
表征致使这些应用程序转变了状态。随着不断获取资源的表征,客户端应用不断地在转变着状态。
ASP.NET Web API直接借鉴了ASP.NET MVC的设计以Controller的形式来定义服务
下面介绍一下ASP.NET API使用
创建Model,以Contact为例
添加ASP.NET API Controller 注意MVC与API集成的基类
编写ASP.NET WEB API,有下面5个方法
路由注册
当我们利用Visual Studio提供的向导一个创建ASP.NET Web API或者ASP.NET MVC应用的时候,在自动生成的静态类型WebApiConfig中会默认为我们注册如下一个路由。
客户端发起WEB APi调用,服务端返回的数据格式是根据客户端的请求类型进行返回的。
ASP.NET Web API会提取HTTP请求的“Accept”报头得到客户端可以接受的媒体类型列表,如果没有匹配的序列化器,默认使用的是针对JSON的序列化器。
如下所示的是通过Chrome访问地址“/api/contacts/001”的请求消息,其“Accept”报头携带的媒体类型列表为“text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8”,最终导致采用XML序列化方式的是源于媒体类型“application/xml”被优先匹配。
GET http://localhost:1379/api/contacts/001 HTTP/1.1
Host: localhost:1379
Connection: keep-alive
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko)
Chrome/20.0.1132.47 Safari/536.11
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: AJSTAT_ok_times=3; _ourplusFirstTime=112-5-15-14-28-38;
_ourplusReturnCount=13; _ourplusReturnTime=112-5-15-14-41-25; theme=Theme2
如果我们通过IE来访问相同的地址(“/api/contacts/001”),则会生成具有如下内容的请求消息。可以清楚地看到Accept报头的媒体列表中不再包含“application/xml”,这会导致Web API找不到与媒体类型完全匹配的序列化器,所以最终会选择基于JSON的默认序列化器。
GET http://localhost:1379/api/contacts/001 HTTP/1.1
Accept: text/html, application/xhtml+xml, */Accept-Language: en-US
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host: localhost:1379
在默认情况下,IE并不会将格式化为JSON的联系人信息显示在浏览器中,而是会弹出一个对话框提示我们将内容保存为一个文件,或者选择相应的应用程序查看响应的内容。如下所示的是整个HTTP响应的内容,可以看到响应报头“Content-Type”的值为“application/json;charset=utf-8”,而主体内容正是Contact对象的JSON表示。
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Sat, 07 Jul 2012 08:05:07 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/json; charset=utf-8
Content-Length: 80
Connection: Close
{"Id":"001","Name":"张三","PhoneNo":"123","EmailAddress":"zhangsan@gmail.com"}
Web API与MVC
Web API本质上就是一个简单的HTTP请求和响应过程,
ASP.NET MVC的路由表是一个Route对象的集合,每个Route对象关联着一个类型为MvcHandler的HttpHandler对象。匹配成功的Route对象利用与之关联的MvcHandler对象来接手对当前请求的处理,而后者将请求递交给ASP.NET MVC框架进行后续处理。
ASP.NET Web API的请求分发机制与之类似,两者的差异体现在采用的路由类型的不同。如图9-4所示,ASP.NET Web API采用的路由对象类型为HttpWebRoute(这是一个内部类型),而与之关联的HttpHandler类型为
System.Web.Http.WebHost.HttpControllerHandler。我们可以将HttpControllerHandler视为URL路由系统与ASP.NET Web API之间的桥梁。