博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Asp.Net Web API(二)
阅读量:5962 次
发布时间:2019-06-19

本文共 5930 字,大约阅读时间需要 19 分钟。

 

创建一个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
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
products = new List
(); 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
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.Controllers2 {3     public class ProductController : ApiController4     {5         static IProductRepository repository= new ProductRepository();6     }7 }

添加CRUD的基本操作方法

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

1  public IEnumerable
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
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
(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类中进行设置路由。

 

转载地址:http://jynax.baihongyu.com/

你可能感兴趣的文章
dubbo remoting(2)
查看>>
maya pyside 多个窗口实例 报错 解决
查看>>
关于文件上传请求第一次为post,后面为get的问题
查看>>
【Qt笔记】QDialog--模态和非模态
查看>>
nginx 0.8.54/1.0.0 在cygwin环境下的编译(包括 nginx_mod_h264
查看>>
PowerDesigner生成Excel版本的数据库文件
查看>>
Oracle 查找常见耗性能的语句
查看>>
java 通过反射获取调用类方法及属性
查看>>
thinkphp 开启页面的Trace信息
查看>>
mysql 链接数满了的错误 ERROR 1040 (HY000): Too many connections
查看>>
android textview字体加下划线
查看>>
springMVC 定时任务
查看>>
Mint8(ubuntu16.04) 搭建微信Web开发工具
查看>>
PostgreSQL数据类型-数据类型简介和布尔类型
查看>>
PostgreSQL数据类型-二进制数据和字符串数据类型与字符串函数
查看>>
安装应用的时候拷贝一个DB文件到应用database下
查看>>
shell 基础
查看>>
twisted的LineReceiver的接口定义
查看>>
浅解用PHP实现MVC
查看>>
MySQL常用操作
查看>>