`

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 网站项目

Untitled picture

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

using

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

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

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

1
2
3
4
5
6
7
public  class ProductController : ApiController {
 
   public IQueryable<product> GetAllProducts() { ... }
 
   public Product GetProductById(int id) { ... }
 
}</product>

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 Method URI Action
GET /api/products GetAllProducts
GET /api/products/5 GetProduct(5)
POST /api/products HTTP 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 里面包含新资源的地址。

新建资源的最终代码如下:

1
2
3
4
5
6
7
public HttpResponseMessage<product> PostProduct(Product product) {
   this._dbContext.Save(product);
   var result = new HttpResponseMessage<product>(product, HttpStatusCode.Created);
   var location = Url.Route(null, new { id = product.ProductID });
   result.Headers.Location = new Uri(location);
   return result;
}</product></product>

更新资源内容

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

1
2
3
4
5
6
7
8
public HttpResponseMessage PutProduct(int id, Product product) {
   if (!this._dbContext.Products.Any(p => p.ProductID == id)) {
      throw new HttpResponseException(HttpStatusCode.NotFound);
   }
   product.ProductID = id;
   this._dbContext.Update(product);
   return new HttpResponseMessage(HttpStatusCode.OK);
}

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

删除资源

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

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

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

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

1
2
3
4
5
public HttpResponseMessage DeleteProduct(int id) {
   var product = this._dbContext.Products.FirstOrDefault(p => p.ProductID == id);
   this._dbContext.Delete(product);
   return new HttpResponseMessage(HttpStatusCode.NoContent);
}
 
分享到:
评论

相关推荐

    ASP.NET Web API 2 Recipes(英文pdf)

    ASP.NET Web API 2 Recipes provides you with the code to solve a full range of Web API problems and question marks that you might face when developing line-of-business applications. ASP.NET Web API 2 ...

    ASP.NET WEB API 程序设计

    《ASP.NET Web API设计》依托ASP.NET Web API阐述API设计与开发的通用技术,是一本全面介绍如何构建真实可演化API的实践指南。本书共分三部分。第一部分介绍Web/HTTP和API开发的基础知识,介绍ASP.NET Web API,为...

    ASP.NET Web API 接收文件上传

    ASP.NET Web API 是微软开发的一个用于构建RESTful服务的框架,它可以轻松地为Web应用程序、移动设备和桌面应用提供数据接口。在ASP.NET Web API中处理文件上传是常见的需求,特别是当你需要允许用户通过Web界面提交...

    asp.net web api pdf

    ASP.NET Web API是微软开发的一个用于构建RESTful服务的框架,它基于ASP.NET技术栈,广泛应用于构建Web应用程序和服务,尤其是对于移动应用、浏览器插件和服务器端数据交互。本教程《ASP.NET Web API设计》深入浅出...

    asp.net webapi2 基于token令牌的身份验证

    本文将深入探讨ASP.NET WebAPI2如何实现基于Token的令牌身份验证。 首先,我们需要理解Token的身份验证原理。这种机制下,用户登录后,服务器会生成一个唯一的Token,这个Token包含了一些关于用户的信息,经过加密...

    《ASP.NET Web API 2框架揭秘》源码示例

    第1章 S101 一个简单的ASP.NET Web API应用 第2章 S201 通过路由实现请求地址与.aspx页面的映射 S202 基本路由注册 S203 在路由注册中指定约束 S204 针对现有物理文件的路由(关闭) S205 针对现有物理文件的...

    ASP.NET Web API 2 框架揭秘,带完整目录和源码

    本资源包含了该框架的详细揭秘以及完整的源代码,帮助开发者深入理解并实践ASP.NET Web API 2 的开发。 1. **RESTful架构**:ASP.NET Web API 2 遵循REST(Representational State Transfer)原则,通过HTTP方法...

    Asp.Net WebApi 上传文件方法(原生js上传和JQ ajax上传)

    在Asp.Net WebApi框架中,开发Web服务接口来处理文件上传是一项常见的任务。本教程将探讨两种不同的客户端上传方式:原生JavaScript和jQuery AJAX。这两种方法都可以与Asp.Net WebApi结合,实现用户友好的文件上传...

    ASP.NET WebAPI连接数据库的方法

    首先,需要了解的是WebAPI项目的基本创建流程,即通过Visual Studio创建一个新的*** Web Application (.NET Framework)项目,选择WebAPI作为项目模板。创建项目后,我们会在项目中看到一个名为ValuesController的...

    ASP.NET Web API

    在深入探讨ASP.NET Web API之前,我们先理解一下REST的基本概念。RESTful服务通过HTTP方法(GET、POST、PUT、DELETE等)来操作资源,并使用URI(Uniform Resource Identifier)作为资源的唯一标识。这种设计模式使得...

    ASP.NET Web API 高级编程(Pro ASP.NET Web API HTTP Web Services in ASP.NET)

    最新的Pro ASP.NET Web API HTTP Web Services in ASP.NET; 英文高清pdf; 2013年新书,学习ASP.NET Web API 现阶段最权威的一本专业教材; 前置技能:C#(掌握) , MVC(掌握或了解) ,数据库(掌握),HTML(掌握)...

    ASP.NET Web API 2 框架揭秘(完整带目录、源码版

    《ASP.NET Web API 2框架揭秘》一本注重实证的书,功能各异、多达120个可供下载的示例,大量最佳实践与实用性扩展,可直接用于解决实际开发问题。全新的学习方法,通过完整论证来实现彻底的融会贯通。本书可以作为讲...

    Asp.Net Web API 实例

    这个实例将涵盖几个核心概念,帮助你理解如何有效地使用Asp.Net Web API。 1. **更改默认路由表**:在Asp.Net Web API中,路由是决定HTTP请求如何映射到控制器和操作的方法。默认情况下,路由模板为"api/{...

    asp.net WebAPI OWIN OAuth2.0授权自定义返回结果及错误或异常问题处理办法

    asp.net WebAPI OWIN OAuth2.0授权自定义返回结果及错误或异常问题处理核心代码,详情: https://www.cnblogs.com/wgx0428/p/12315546.html

    ASP.NET Web API 2 框架揭秘(完整带目录、源码版)

    ASP.NET Web API 2框架揭秘》一本注重实证的书,功能各异、多达120个可供下载的示例,大量最佳实践与实用性扩展,可直接用于解决实际开发问题。全新的学习方法,通过完整论证来实现彻底的融会贯通。

    【ASP.NET编程知识】.net webapi接收xml格式数据的3种情况小结.docx

    在 ASP.NET 编程中,Web API 是一个框架,可以很容易构建达成了广泛的 HTTP 服务客户端,包括浏览器和移动设备。是构建 RESTful 应用程序的理想平台的 .NET 框架。在本文中,我们将主要介绍 .NET Web API 接收 XML ...

    ASP.NET WebAPI 接口自测工具(v4.0最新版)

    自己在研究ASP.NET WebAPI的过程中,为了方便自己调试,写了一个自测工具。 可以进行 application/json 协议的访问,也可以进行 application/x-www-form-urlencoded 协议的访问。 为了方便经常调试某个接口,可将 ...

    ASP.NET Web API 对list增删改查的实例 REST

    标题提到的"ASP.NET Web API对list增删改查的实例",意味着我们将讨论如何使用Web API处理列表数据的常见操作。在.NET开发环境中,VS12(Visual Studio 2012)是常用的一款IDE,它支持创建和调试ASP.NET Web API项目...

Global site tag (gtag.js) - Google Analytics