您的位置:首页 > 编程语言 > ASP

ASP.NET Web API 简介

2016-09-23 18:01 232 查看
ASP.NET Web API 简介

ASP.NET MVC 4 包含了 ASP.NET Web API, 这是一个创建可以连接包括浏览器、移动设备等多种客户端的 Http 服务的新框架, ASP.NET Web API 也是构建 RESTful 服务的理想平台。

ASP.NET Web API 特性

ASP.NET Web API 包含下列特性:

先进的 HTTP 编程模型: 使用新的强类型的 HTTP 对象模型直接操作 HTTP 请求和响应, 在 HTTP客户端使用相同的编程模型和 HTTP 管道;

支持路由: Web API 完整支持 ASP.NET 路由, 包括路由参数和约束。 此外, 到动作的映射支持约定, 从此将不再需要向类或者方法添加类似于 [HttpPost] 之类的属性;

内容协商: 客户端与服务端可以一起决定 API 返回数据的格式。 默认支持 XML, JSON 以及 Form URL-Encoded 格式, 可以扩展添加自定义格式, 甚至可以替换掉默认的内容协商策略;

模型绑定与验证: 模型绑定器可以轻易地从 HTTP 请求中提取数据并转换成在动作方法中使用的 .Net 对象;
过滤: Web API 支持过滤, 包括总所周知的 [Authorize] 过滤标记, 可以为 Action 添加并插入自定义过滤, 实现认证、异常处理等;

查询聚合: 只要简单的返回 Iqueryable<T> , Web API 将会支持通过 OData 地址约定进行查询;

改进的 Http 细节可测试性: Web API 不是将 HTTP 细节设置到一个静态的 Context 对象上, 而是使用 HttpRequestMessage 和 HttpResponseMessage 实例, 可以使用这些对象的泛型版本为这些 Http 类型添加自定义类型;

改进的依赖反转 (IoC) 支持: Web API 使用 MVC Dependency Resolver 实现的服务定位器模式在不同的场景下来获取实例;

基于代码的配置: Web API 单独使用代码完成配置, 从而保证了配置文件的整洁;
自托管 (Self-Host) : Web API 除了可以托管在 IIS 中, 还可以托管在进程中,依旧可以使用路由以及其它的特性。

第一个 Web API 程序

从零开始创建 Web API 项目

1、 创建一个空的 ASP.NET 4.0 网站项目



2、 添加对 System.Net.Http , System.Net.Http.Formatting , System.Web.Http , System.Web.Http.Common , System.Web.Http.WebHost 的引用



3、 添加 Global Application Class , 并在 Global 类中的 Application_Start 方法中添加如下代码:

?
4、添加一个 ProductsController , 继承自 ApiController , 代码如下:

?
5、 在浏览器输入 URI 访问资源, 也可以通过脚本等任何客户端进行访问, 以浏览器为例:

在地址栏输入 http://localhost:64334/api/products 将会访问到 GetAllProducts 方法, 返回所有的 Product 实例;

在地址栏输入 http://localhost:64334/api/products /1 将会访问到 GetProductById 方法, 返回指定 id 的 Product 实例;

理解 API 路由

对于每一个 Http 消息, ASP.NET Web API 框架通过路由表决定由哪个控制器处理请求。 当你创建一个新的 Web API 项目时, 将会包含一个类似这样的一个默认的路由:

/api/{controller}/{id}

{controller} 和 {id} 是两个占位符, 当遇到一个符合这种样式的 URI , 将将会开始寻找合适的控制器方法进行调用, 规则如下:

{controller} 用来与控制器名称像匹配;
HTTP 请求的方法用来与方法名称匹配; (本规则只适用于 GET, POST, PUT 和 DELETE)
{id} , 如果有, 将会用于和方法的 id 参数进行匹配;
这里有一些请求的例子, 以及基于当前实现情况的的 HTTP 动作结果:

HTTP MethodURIAction
GET/api/productsGetAllProducts
GET/api/products/5GetProduct(5)
POST/api/productsHTTP Status 405
GET/api/users/HTTP Status 404
在第一个例子中, 与 "products" 相匹配的是 ProductsController , HTTP 请求的方法是 GET , 所以框架开始在 ProductController 类里面寻找以 “Get” 开头的方法, 此外, URI 中没有提供 id 参数, 所以框架要找一个没有参数的方法, 最后, ProductsController 的 GetAllProducts 方法满足要求。

第二个例子与第一个类似, 不同的是 URI 里面包含了 {id} 参数。 因此, 框架调用 GetProduct 方法, 因为它需要一个名称为 id 参数。 值得注意的是, URI 里面的 id 参数是字符串类型的 “5” , 框架会根据方法的签名自动把它转换成整形。

在第三个例子中, 客户端发起 HTTP Post 请求, 框架寻找名称以 “Post” 开始的方法。 而 ProductController 类没有这样的方法, 所以框架返回的 HTTP 状态码是 405 , 表示不允许调用的方法 (Method Not Allowed) 。

再看第四个例子, 客户端发送一个 GET 请求到 /api/users 。 框架寻找名称为 UserController 的控制器, 这样的类还没有定义, 所以框架返回的 HTTP 状态码是 404 , 表示请求的资源未找到。

Web API CURD

什么是 CURD

CURD 是指 Create 、 Update 、 Read 、 Delete 四个简单的数据库操作, 通常大多数 Web 服务也通过 REST 风格的服务提供这些操作。

接下来将继续完善 ProductsController 以支持下面所有的操作:

动作
HTTP
方法
相对路径
获取全部
GET
/api/products
指定 id
获取
GET
/api/products/id
添加
POST
/api/products
更新
PUT
/api/products/id
删除
DELETE
/api/products/id

资源

ProductController 提供了两种 URI 资源:

资源
地址
全部产品列表
/api/products
单个产品
/api/products/id
HTTP 的四个主要方法 (GET, PUT, POST, DELETE) 按照下列方式映射为 CURD 操作:

GET 用于获取 URI 资源的进行展示, GET 操作不应对服务端有任何影响;
PUT 用于更新 URI 上的一个资源, 如果服务端允许, PUT 也可以用于新建一个资源;
POST 用于新建 资源, 服务端在指定的 URI 上创建一个新的对象, 将新资源的地址作为响应消息的一部分返回;
DELETE 用于删除指定的 URI 资源。

实现 CURD

新建资源

客户端发起 HTTP POST 请求新建资源, 为了能处理 POST 请求, 需要在 ProductController 定义一个以 Post 开头的方法, 这个方法接受一个类型为 Product 的参数。

根据 HTTP/1.1 协议, 需要注意的问题有:

响应代码: Web API 默认返回的响应代码是 200 (OK) , 但是根据 HTTP/1.1 协议, POST 请求并创建资源的响应代码应该是 201 (Created);

地址: 当服务器创建资源之后, 应该在响应的 Header 里面包含新资源的地址。
新建资源的最终代码如下:

?

更新资源内容

更新是比较简单的, 代码如下:

?
该方法需要两个参数, id 从 URI 中获取, product 从客户端请求消息中获取。

删除资源

根据 HTTP 协议, 删除应当是幂等的, 也就是说一个 URI 上接受到多少个删除请求都是相同的, 如果资源已经被删除, 也不能返回错误的响应代码。

如果成功删除了资源, 可以返回 200 (OK) 响应代码, 以及一个实体进行状态说明, 或者返回 204 (No Content)。

如果删除需要等待事务完成, 则应该返回 202 (Accepted) 。

删除资源的实现代码如下:

?
张志敏所有文章遵循创作共用版权协议,要求署名、非商业 、保持一致。在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处。

本博客已经迁移到 GitHub , 围观地址: http://beginor.github.io/
分类:
ASP.NET MVC

好文要顶
关注我
收藏该文







张志敏
关注 - 0
粉丝 - 252

+加关注

17
0

«
上一篇:MonoTouch 在 iOS 上定义的一些特殊目录
»
下一篇:Web API 依赖注入与扩展

posted @ 2012-03-19 21:00
张志敏 阅读(62119) 评论(11)

编辑
收藏

评论列表

  
#1楼
2012-05-12 13:10
temptation
 

是博主翻译的么?赞
支持(0)反对(0) http://pic.cnblogs.com/face/u14156.jpg
  
#2楼
2014-04-14 21:05
小草旁的大树
 

亲,有源码没有?第一步 Application_Start 就出错了。
支持(0)反对(0) http://pic.cnblogs.com/face/258106/20140221100031.png
  
#3楼
2014-08-05 09:45
NewBao
 

@ 小草旁的大树

这是要添加两个引用的.

using System.Web.Http;

using System.Web.Routing;
支持(0)反对(0) http://pic.cnblogs.com/face/u249722.jpg
  
#4楼
2014-09-15 17:16
SuSuger
 

询问楼主。为什么我找不到System.Net.Http , System.Net.Http.Formatting , System.Web.Http , System.Web.Http.Common , System.Web.Http.WebHost
支持(1)反对(0)

  
#5楼
2014-09-28 14:24
moto1983
 

好像是笔误吧! ProductController -》ProductsController
支持(0)反对(0)

  
#6楼
2015-03-26 13:04
郁胜波
 

我只能说“呵呵”
支持(0)反对(0)

  
#7楼
2015-12-25 16:44
白细胞
 

楼主好,请问 web api 和socket有类似的地方吗
支持(0)反对(0) http://pic.cnblogs.com/face/647983/20151216145018.png
  
#8楼[楼主]
2015-12-26 16:32
张志敏
 

@ 白细胞

这两者基本上没有什么类似的地方
支持(0)反对(0) http://pic.cnblogs.com/face/u8989.jpg
  
#9楼
2016-01-25 11:11
BePractitioner
 

@ SuSuger
引用
询问楼主。为什么我找不到System.Net.Http , System.Net.Http.Formatting , System.Web.Http , System.Web.Http.Common , System.Web.Http.WebHost

找不到这几个引用
支持(0)反对(0)

  
#10楼
2016-01-25 11:12
BePractitioner
 

是哪个framwork版本的呀
支持(0)反对(0)

  
#11楼34905742016/8/16
22:11:17 2016-08-16 22:11
菠菜团子
 

试着在程序集-》扩展下面找下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: