Asp.Net Web API(二)

创建一个Web API项目

第一步,创建以下项目

当然,你也可以创建一个Web API项目,利用 Web API模板,Web API模板使用 ASP.Net MVC提供API的帮助页。

添加Model

一个模型就是在你的应用程序中展示数据的一个对象。ASP.NET Web API 可以自动序列化你的模型到JSON,XML或一些其它格式,然后把已序列化的数据写入到HTTP响应消息的正文。只要客户端可以读取序列化的数据,那么它同样可以反序列这个对象。大多数的客户端都可以解析JSON或XML。此外,客户端可以声明它想要通过HTTP请求消息中设置的接收标头的那种格式。

然后我们在Models目录下创建一个简单的展示商品的Model

namespace WebAPIDemo.Models
{
    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Category { get; set; }
        public decimal Price { get; set; }
    }
}

  

添加Repository

首先我们需要存储产品的集合,分开手机我们的服务是一个好主意,这种方式,我们可以改变后备存储,而不用修改服务器的实现,这种模型的设计叫做仓储模型,首先建立一个接口

namespace WebAPIDemo.Models
{
   public interface IProductRepository
    {
        IEnumerable<Product> GetAll();
        Product Get(int id);
        Product Add(Product item);
        void Remove(int id);
        bool Update(Product item);
    }
}

 暂时我们把接口和实现类放在一个目录下,现在在Models目录下添加另外一个类,这个类将实现IProductRepository接口

 1 namespace WebAPIDemo.Models
 2 {
 3     public class ProductRepository : IProductRepository
 4     {
 5         private List<Product> products = new List<Product>();
 6         private int _nextId = 1;
 7         public ProductRepository()
 8         {
 9             Add(new Product { Name = "一加5", Category = "一加", Price = 2999 });
10             Add(new Product { Name = "小米pro", Category = "小米", Price = 5599 });
11             Add(new Product { Name = "一加X", Category = "一加", Price = 1499 });
12         }
13         public Product Add(Product item)
14         {
15             if (item == null)
16                 throw new ArgumentNullException("item");
17             item.Id = _nextId++;
18             products.Add(item);
19             return item;
20         }
21
22         public Product Get(int id)
23         {
24             return products.Find(y => y.Id == id);
25         }
26
27         public IEnumerable<Product> GetAll()
28         {
29             return products;
30         }
31
32         public void Remove(int id)
33         {
34             products.RemoveAll(y => y.Id == id);
35         }
36
37         public bool Update(Product item)
38         {
39             if (item == null)
40                 throw new ArgumentNullException("item");
41             int index = products.FindIndex(y => y.Id == item.Id);
42             if (index < 0)
43                 return false;
44             products.RemoveAt(index);
45             products.Add(item);
46             return true;
47         }
48     }
49 }

添加Controller

在ASP.NET Web API中,控制器就是一个处理HTTP请求的对象。我们将添加一个控制器,它即可以返回一个商品的列表数据,也可以通过产品编号返回单个产品信息。

注意,如果你使用了ASP.NET MVC 已熟悉控制器,Web API控制器类似于MVC控制器,但是继承ApiController,而不是Controller类

1 namespace WebAPIDemo.Controllers
2 {
3     public class ProductController : ApiController
4     {
5         static IProductRepository repository= new ProductRepository();
6     }
7 }

添加CRUD的基本操作方法

第一个:得到所有产品信息列表,在控制器中添加方法如下

1  public IEnumerable<Product> GetProducts()
2  {
3      return repository.GetAll();
4  }

这个方法是以Get开头,所以通过约定映射Get请求,此外,因为不包含参数,它映射一个不包含在路径中的id字段的URI

第二个方法:通过产品编号获取一个产品信息,在控制器添加方法如下

1 public Product GetProduct(int id)
2 {
3             var item = repository.Get(id);
4             if (item == null)
5                 //未找到抛出一个404的状态码异常
6                 throw new
7                   HttpResponseException(HttpStatusCode.NotFound);
8             return item;
9 }

这个方法的名称是以Get开头但这个方法有一个名字为id的参数。这个参数被映射到URI路径中的id字段。这个Asp.Net Web API框架自动把id参数转换为正确的int数据类型,如果id无效,就会抛出一个HttpResponseException异常。此异常将有框架转换成一个404错误。

第三个:按照类型查找产品信息,在控制器中添加方法如下

1 public IEnumerable<Product> GetProductsByCategory(string category)
2 {
3             return repository.GetAll().Where(y => String.Equals(y.Category, category, StringComparison.OrdinalIgnoreCase));
4 }

如果请求的URI中包含查询字符串,这个Web API试图在控制器方法的参数中来匹配查询字符串。因此,窗体中“api/products?category=category”的URI将映射到此方法。

第四个:添加一个新产品,在控制器添加的方法如下

1 public Product PostProduct(Product item)
2 {
3             item = repository.Add(item);
4             return item;
5 }

请注意这个方法的两个事情:

这个方法的名字以“Post”开头,为了创建一个新产品,这个客户端将发送一个HTTP Post请求。这个方法采用类型为Product的参数。在Web API中复杂类型的参数是从请求消息体中反序列化得到的,因此,我们期待客户端发送XML或JSON格式的一个产品对象的序列号表现形式

此实现会工作,但它还很不完整。理想情况下,我们希望的HTTP响应。包含以下内容:

响应代码:在默认情况下,这个Web API框架设置响应状态码为200(OK)。但是根据这个HTTP/1.1协议,当POST请求在创建一个资源时,这个服务端应该回复状态201(Created)。位置:当服务端创建一个资源时,它应该在响应的Location标头中包含这个资源的URI。

ASP.NET Web API使它容易操作HTTP响应消息。这个改善后的代码:

public HttpResponseMessage PostProduct(Product item)
{
            item = repository.Add(item);
            //创建返回对象HttpResposeMessage并将回复状态设置为201.
            HttpResponseMessage respose = Request.CreateResponse<Product>(HttpStatusCode.Created, item);
            String uri = Url.Link("DefaultApi", new { id = item.Id });
            //设置HttpResposeMessage标头中Locaion
            respose.Headers.Location = new Uri(uri);
            return respose;
}

请注意:此方法返回类型现在是HttpResponseMessage。通过返回HttpResponseMessage而不是产品,我们可以控制HTTP响应消息,包括状态代码和位置标头的详细信息。

CreateResponse方法将会创建HttpResponseMessage,并自动将Product对象序列化表示形式写入到响应消息的正文中。

第四个:通过PUT更新产品

1 public void PutProduct(int id,Product product)
2 {
3             product.Id = id;
4             if(!repository.Update(product))
5                 throw new HttpResponseException(HttpStatusCode.NotFound);
6 }

方法名称以Put开头,这样Web API就能够将其与PUT请求相匹配。这个方法有两个参数,一个是产品id和更新的产品,id参数是从URI中获得的,product参数是从请求正文反序列化得来的。默认情况下,ASP.NET Web API框架从路由获取简单的参数类型,从请求正文获取复杂的类型。

第五个方法:删除产品,在控制器添加代码如下。

1  public void DeleteProduct(int id)
2 {
3             Product item = repository.Get(id);
4             if (item == null)
5                 throw new HttpResponseException(HttpStatusCode.NotFound);
6             repository.Remove(id);
7 }

如果删除成功,它可以返回状态200(OK)与实体的描述该状态;如果删除依然挂起,则返回状态202(已接受);或状态与没有实体正文204(无内容)。在这种情况下,DeleteProduct方法具有void返回类型,因此ASP.NET Web API自动转换此状态代码204(无内容)

运行测试

方法创建完毕后我们就可以运行服务端进行测试了

上述测试我们发现我们的路由只是“api/{controler}”就成功返回了GetProducts方法中的数据,这也是ASP.NET Web API与ASP.NET MVC 之间的区别。Web API路由可以没有{Action},只通过HTTP请求方式来匹配路由,并且路由默认以api启示,如果想要设置,在App_Start中WebApiConfig类中进行设置路由。

时间: 2024-08-11 05:07:33

Asp.Net Web API(二)的相关文章

ASP.NET Web API 过滤器创建、执行过程(二)

前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器中,当然默认的基础服务也是有的,并且根据这些提供程序所获得的的过滤器信息集合进行排序.本篇就会对过滤器在创建完之后所做的一系列操作进行讲解. ASP.NET Web API 过滤器创建.执行过程(二) FilterGrouping过滤器分组类型 FilterGrouping类型是ApiController类型中的私有类型,它的作用就如同它的命名一样,用来对过

ASP.NET Web API 控制器创建过程(二)

ASP.NET Web API 控制器创建过程(二) 前言 本来这篇随笔应该是在上周就该写出来公布的,因为身体跟不上节奏感冒发烧有心无力,这样的天气感冒发烧生不如死,也真正的体会到了什么叫病来如山倒,病去如抽丝.这两天状态才好了一点,让我理解了什么才是革命的本钱,希望大家也多保重身体. 好了,还是回归主题,对于上一篇的内容解说的仅仅是ASP.NET Web API控制器创建过程中的一个局部知识,在接着上篇内容解说的之前,我会先回想一下上篇的内容,而且在本篇里进行整合,让我们要看到的是一个整个的创

细说Asp.Net Web API消息处理管道(二)

在细说Asp.Net Web API消息处理管道这篇文章中,通过翻看源码和实例验证的方式,我们知道了Asp.Net Web API消息处理管道的组成类型以及Asp.Net Web API是如何创建消息处理管道的.本文在上篇的基础上进行一个补充,谈谈在WebHost寄宿方式和SelfHost寄宿方式下,请求是如何进入到Asp.Net Web API的消息处理管道的. WebHost寄宿方式: 在剖析Asp.Net WebAPI路由系统一文中,我们知道Asp.Net Web API在WebHost寄

Asp.Net Web API 2第十二课——Media Formatters媒体格式化器

前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本教程演示如何在ASP.NET Web API中支持额外的媒体格式. Internet Media Types——Internet的媒体类型 媒体类型,也叫做MIME类型,标识了一片数据的格式.在HTTP中,媒体类型描述了消息体的格式.一个媒体类型由两个字符串组成:类型和子类型.例如: text/html image/png

ASP.NET Web API(二):安全验证之使用HTTP基本认证

在前一篇文章ASP.NET Web API(一):使用初探,GET和POST数据中,我们初步接触了微软的REST API: Web API. 我们在接触了Web API的后就立马发现了有安全验证的需求,所以这篇文章我们先来讨论下安全验证一个最简单的方法:使用HTTP基本认证. HTTP基本认证原理 在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份认证的方法,当一个客户端向HTTP服务器进行数据请求时,如果客户端未被认证,则HTTP服务器

ASP.NET Web API 学习 二

Technorati 标记: ASP.NET Web API 既然是 Web API,那么就会有不同的请求. Http 的基本请求方法如下: GET     请求获取Request-URI所标识的资源 POST    在Request-URI所标识的资源后附加新的数据 PUT     请求服务器存储一个资源,并用Request-URI作为其标识 DELETE  请求服务器删除Request-URI所标识的资源 以上4种方法,基本对应查询.新增.更新.删除 4种操作. 查询: 1)无参数: pub

使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【开篇】【持续更新中。。。】

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 最近发现web api很火,园内也有各种大神已经在研究,本人在asp.net官网上看到一个系列教程,原文地址:http://bitoftech.net/2013/11/25/detailed-tutorial-building-asp-net-

通过Knockout.js + ASP.NET Web API构建一个简单的CRUD应用

REFERENCE FROM : http://www.cnblogs.com/artech/archive/2012/07/04/Knockout-web-api.html 较之面向最终消费者的网站,企业级Web应用对用户体验的要求要低一些.不过客户对“用户体验”的要求是“与日俱增”的,很多被“惯坏了”的用户已经不能忍受Postback带来的页面刷新,所以Ajax在企业级Web应用中得到了广泛的应用.企业级Web应用的一个特点是以“数据处理”为主,所以“面向绑定”的Knockout.js 是一

ASP.NET Web API中使用OData

在ASP.NET Web API中使用OData 一.什么是ODataOData是一个开放的数据协议(Open Data Protocol)在ASP.NET Web API中,对于CRUD(create, read, update, and delete)应用比传统WebAPI增加了很大的灵活性只要正确使用相关的协议,可以在同等情况下对一个CRUD应用可以节约很多开发时间,从而提高开发效率 二.怎么搭建 做一个简单的订单查询示例我们使用Code First模式创建两个实体对象Product(产品