HTTP不仅仅是用来支持网页通信的。HTTP可以用来创建api,暴露一些数据和接口,以供调用。HTTP具有平台无关性,可以为很多客户端提供服务,包括浏览器,移动端,传统的桌面应用程序。
在此例中,你将获取到如图所示的由web-api提供的产品列表。
1.打开visiual studio,开始--新建--新建工程。
2.选择已安装的模板,在Visual C#下选择web--ASP.NET Web Application,输入项目名称,点击确定。
3.在下图中的对话框中选择空模板,勾选下方的webapi选项,点击确定。
4.添加模型
在HTTP中,服务器端是将模型序列化为xml或者json格式在网络中传输的,然后到达客户端以后反序列化得到数据模型.很多客户端是支持解析xml或者json的。而且,他们在请求数据的时候是可以通过请求头优先确认需要返回的数据类型的。
译者理解:网络中传输是通过http协议进行的,也就是超文本传输协议,所以传递的数据格式基本上有限制,在我们自己封装了一个数据模型的时候,比如,我们创建了一个学生的模型,这个模型中包含着学号,姓名,性别,年龄几个属性,我们直接通过http传递一个学生类型的数据是不合理的,只有将其序列化为可传递的xml数据类型,或者json类型,这样一个序列化,一个反序列化就把一个完整的学生类型或者说学生模型从服务器端传递到客户端了。
我们来创建一个简单的产品模型。如下图所示,在解决方案中右键models文件夹,新建一个类,类名Product。
译者tips:添加如下代码,下面的代码就是产品类的定义,主要是一些属性:id,name,category,price,学过c#的都能看懂,就不多解释了。
C#Copy
namespace ProductsApp.Models
{
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Category { get; set; }
public decimal Price { get; set; }
}
}
一个控制器是用来处理HTTP请求的对象,我们可以添加一个控制器,既可以返回一个产品列表,又可以依据产品id返回单个产品信息。
注意:webapi的控制器是继承自ApiController类的
解决方案中右键Controllers文件夹,添加一个控制器。
在下面的界面中选择一个空的控制器。
将控制器命名为ProductsController
解决方案中会多出一个ProductsController.cs文件来,如下图所示。
以下就是控制器的相关代码:
C#Copy
using ProductsApp.Models; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Web.Http; namespace ProductsApp.Controllers {
//这里的控制器类是继承自ApiController的 public class ProductsController : ApiController {
//不要看着一堆代码就发憷,这里只是初始化了一个产品的数组,里面随便存了一些信息。 Product[] products = new Product[] { new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 }, new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M }, new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M } }; //这里是返回了所有的产品信息,你会看到把整个产品数组返回了,因为数组实现了可枚举IEnumetable接口的,所以,这里的返回类型是正确的,不要惊讶 public IEnumerable
GetAllProducts() { return products; } //这里先这么理解,不需要深究,这里返回的是一个ActionResult,成功返回ok结果,否则范围未找到。 public IHttpActionResult GetProduct(int id) {//兰布达表达式返回查询结果,要和输入的id进行匹配 var product = products.FirstOrDefault((p) => p.Id == id); if (product == null) { return NotFound(); } return Ok(product); } } }
这里定义了两个方法:
GetAllProducts
GetProduct
下面就是webapi访问的url:
Controller Method | URI |
---|---|
GetAllProducts | /api/products |
GetProduct | /api/products/id |
这个部分并没有采用原文中的测试方式,我们可以用浏览器测试一下。
译者tips:
访问全部列表的路径是api/products
访问序号为3的路径是api/products/3