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接口
namespace WebAPIDemo.Models
{
public class ProductRepository : IProductRepository
{
private List<Product> products = new List<Product>();
private int _nextId = ;
public ProductRepository()
{
Add(new Product { Name = "一加5", Category = "一加", Price = });
Add(new Product { Name = "小米pro", Category = "小米", Price = });
Add(new Product { Name = "一加X", Category = "一加", Price = });
}
public Product Add(Product item)
{
if (item == null)
throw new ArgumentNullException("item");
item.Id = _nextId++;
products.Add(item);
return item;
} public Product Get(int id)
{
return products.Find(y => y.Id == id);
} public IEnumerable<Product> GetAll()
{
return products;
} public void Remove(int id)
{
products.RemoveAll(y => y.Id == id);
} public bool Update(Product item)
{
if (item == null)
throw new ArgumentNullException("item");
int index = products.FindIndex(y => y.Id == item.Id);
if (index < )
return false;
products.RemoveAt(index);
products.Add(item);
return true;
}
}
}
添加Controller
在ASP.NET Web API中,控制器就是一个处理HTTP请求的对象。我们将添加一个控制器,它即可以返回一个商品的列表数据,也可以通过产品编号返回单个产品信息。
注意,如果你使用了ASP.NET MVC 已熟悉控制器,Web API控制器类似于MVC控制器,但是继承ApiController,而不是Controller类
namespace WebAPIDemo.Controllers
{
public class ProductController : ApiController
{
static IProductRepository repository= new ProductRepository();
}
}
添加CRUD的基本操作方法
第一个:得到所有产品信息列表,在控制器中添加方法如下
public IEnumerable<Product> GetProducts()
{
return repository.GetAll();
}
这个方法是以Get开头,所以通过约定映射Get请求,此外,因为不包含参数,它映射一个不包含在路径中的id字段的URI
第二个方法:通过产品编号获取一个产品信息,在控制器添加方法如下
public Product GetProduct(int id)
{
var item = repository.Get(id);
if (item == null)
//未找到抛出一个404的状态码异常
throw new
HttpResponseException(HttpStatusCode.NotFound);
return item;
}
这个方法的名称是以Get开头但这个方法有一个名字为id的参数。这个参数被映射到URI路径中的id字段。这个Asp.Net Web API框架自动把id参数转换为正确的int数据类型,如果id无效,就会抛出一个HttpResponseException异常。此异常将有框架转换成一个404错误。
第三个:按照类型查找产品信息,在控制器中添加方法如下
public IEnumerable<Product> GetProductsByCategory(string category)
{
return repository.GetAll().Where(y => String.Equals(y.Category, category, StringComparison.OrdinalIgnoreCase));
}
如果请求的URI中包含查询字符串,这个Web API试图在控制器方法的参数中来匹配查询字符串。因此,窗体中“api/products?category=category”的URI将映射到此方法。
第四个:添加一个新产品,在控制器添加的方法如下
public Product PostProduct(Product item)
{
item = repository.Add(item);
return item;
}
请注意这个方法的两个事情:
这个方法的名字以“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更新产品
public void PutProduct(int id,Product product)
{
product.Id = id;
if(!repository.Update(product))
throw new HttpResponseException(HttpStatusCode.NotFound);
}
方法名称以Put开头,这样Web API就能够将其与PUT请求相匹配。这个方法有两个参数,一个是产品id和更新的产品,id参数是从URI中获得的,product参数是从请求正文反序列化得来的。默认情况下,ASP.NET Web API框架从路由获取简单的参数类型,从请求正文获取复杂的类型。
第五个方法:删除产品,在控制器添加代码如下。
public void DeleteProduct(int id)
{
Product item = repository.Get(id);
if (item == null)
throw new HttpResponseException(HttpStatusCode.NotFound);
repository.Remove(id);
}
如果删除成功,它可以返回状态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类中进行设置路由。
Asp.Net Web API(二)的更多相关文章
- ASP.NET Web API 过滤器创建、执行过程(二)
ASP.NET Web API 过滤器创建.执行过程(二) 前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器 ...
- ASP.NET Web API 控制器创建过程(二)
ASP.NET Web API 控制器创建过程(二) 前言 本来这篇随笔应该是在上周就该写出来发布的,由于身体跟不上节奏感冒发烧有心无力,这种天气感冒发烧生不如死,也真正的体会到了什么叫病来如山倒,病 ...
- ASP.NET Web API 2系列(二):灵活多样的路由配置
1. 导言 路由系统是请求消息进入ASP.NET Web API消息处理管道的第一道屏障,其根本目的在于利用注册的路由对请求的URL进行解析以确定目标HTTPController和Action的名称, ...
- Asp.Net Web API 2第十二课——Media Formatters媒体格式化器
前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本教程演示如何在ASP.N ...
- 使用ASP.NET web API创建REST服务(二)
Creating a REST service using ASP.NET Web API A service that is created based upon the architecture ...
- ASP.NET Web API(二):安全验证之使用HTTP基本认证
在前一篇文章ASP.NET Web API(一):使用初探,GET和POST数据中,我们初步接触了微软的REST API: Web API. 我们在接触了Web API的后就立马发现了有安全验证的需求 ...
- 细说Asp.Net Web API消息处理管道(二)
在细说Asp.Net Web API消息处理管道这篇文章中,通过翻看源码和实例验证的方式,我们知道了Asp.Net Web API消息处理管道的组成类型以及Asp.Net Web API是如何创建消息 ...
- 用ASP.NET Web API技术开发HTTP接口(二)
在第一部分,我们创建了一个基本的ASP.NET Web API项目,新建成功了数据表,然后添加了一些测试数据,最后创建了API控制器,用json格式把数据表里面的内容成功输出到浏览器上.接下来我们将继 ...
- 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用
由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...
随机推荐
- web前端-----第二弹CSS
web前端之CSS样式 CSS 语法 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. ''' selector { property: value; property: value; ...
- alex python of day1
Print("hello word!")#打印hello word!向python世界发生第一声呐喊,仪式很重要 定义变量 name="Alex Li" nam ...
- c# winform 窗体之间的传参
说起winform程序中窗体之间的参数互传,大家找度娘会找到很多方法: 1.在窗体类中创建全局变量,类型为公开.静态的: 2.在窗体类中定义狗仔函数: 3.通过实践来船体参数: 这三种思路完全来自于霖 ...
- Ckeditor与Ckfinder的配合使用,上传图片、水印、修改图片名字为当前日期 asp.net
为了配置出来上传功能,并且还添加水印,修改图片的名字为日期,真的头疼了很久,现在来分享一下自己所做的,也算一点小小的成就吧,顺带帮帮很多还在弄这个的猿们.我是分别用了两种方法.先说低版本的Versio ...
- [flask/python/web] 解析flask web开发(Miguel著)一书第11章主页不显示博文表单的问题
---------------------------------------------以下内容2017.7.14更新---------------------------------------- ...
- 史上最全常用正则表达式(Javascript公众号推文)
2017-04-13 zxin JavaScript很多不太懂正则的朋友,在遇到需要用正则校验数据时,往往是在网上去找很久,结果找来的还是不很符合要求.所以我最近把开发中常用的一些正则表达式整理了一下 ...
- Just for 面试
ZOJ题目分类 初学者题: 1001 1037 1048 1049 1051 1067 1115 1151 1201 1205 1216 1240 1241 1242 1251 1292 1331 1 ...
- 日志模块---logging
作用 在程序的运行过程中,会遇到很多需要打印的中间信息,通过使用logging模块可以详细的输出信息,不同于print()函数的单一功能. 应用场景 对于软件程序的运行过程中输出中间信息,如账单信息, ...
- WinForm程序,实现只启动一个实例
前言:在我们做的软件中,当点击图标运行时,正常的需求是只需要启动一个软件的实例,这是非常重要的一点,不然就显得我们的软件非常的山寨,笔者在工作中经常遇到同事没有注意这一点,看是不重要,实则非常的重要, ...
- 将STM32 iap hex文件与app hex文件合并为一个hex文件
日前公司产品需要增加远程升级功能,boot loader程序写好后交予生产部门使用时他们反馈每个产品程序需要刷写两次(一个boot loader 一个app程序),生产进度变慢浪费时间,于是乎研究如何 ...