[Web API] 进击的 Web API : 建立 Web API 项目

在第一篇 初探 Web API 后,大概已经对 Web API 有基本的了解了,接下来就是要开始动手喽!首先因为我使用 Visual Studio 2010 开发,所以必须要先安装 ASP.NET MVC 4 套件,此套件的下载路径于第一篇文章中有提到,待安装好后就可以继续往下了,就先从建立一个基础的项目开始吧。


前言


  当城墙被打破了之后,我也不得不面对敌人了... 在第一篇 初探 Web API 后,大概已经对 Web API 有基本的了解了,接下来就是要开始动手喽!首先因为我使用 Visual Studio 2010 开发,所以必须要先安装 ASP.NET MVC 4 套件,此套件的下载路径于第一篇文章中有提到,待安装好后就可以继续往下了,就先从建立一个基础的项目开始吧。

建立 Web API 项目


  让我们启动 Visual Studio 2010 ,于 “文件”→“新增”→“项目”开启新增项目窗口,选择范本中的 ASP.NET MVC 4 Web 应用程序。

  在次跳出来的 MVC 4 范本窗口中选择 Web API 后确定。

  建立完成一开始将看到默认产生了一个 ValuesContorller 。


public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    public string Get(int id)
    {
        return "value";
    }

    // POST api/values
    public void Post([FromBody]string value)
    {
    }

    // PUT api/values/5
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE api/values/5
    public void Delete(int id)
    {
    }
}

  在 ValuesController 里默认产生了四种 HTTP 动词 GET、POST、PUT、DELETE,因为架构在 MVC 之上所以可以看到每个方法上的注解有注明路由的位置,而路由的设定我们可以从 RouteConfig.cs 或 WebApiConfig.cs 里设定,这两个路由设定差别在于 RouteConfig.cs 是给 Web Controller 使用而 WebApiConfig.cs 是给 Web API Controller 使用 (另外可参考 Configuring ASP.NET Web API )。

  我们先针对此预先产生出来的 ApiController 来测试一下,心急的你一定会想先看到使用的结果,以 Debug 模式启动程序开发服务器浏览网站。

  试着在网址上输入“http://localhost:51370/api/values”,会发现 IE 会返回一下要求下载的内容,点选下载开启。

  开启后可以发现回传的内容就如同 ValuesController 里的 IEnumerable Get() 方法所设定的值一样,这就是一个基本的 Web API 使用方式。

实践 CRUD 功能


  最基本的调用方式看过了之后,现在我们来稍微调整一下这个新项目,让此 Web API 能够包含新增、修改、更新、删除的功能,首先在 Models 加入一个 Product 类并撰写相关的属性。


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

  接着在 Controller 加入一个新的 ApiController,修改名称为“ProductsController”、范本选择“空白 API 控制器”后按加入,Web API 的 Controller 都必须继承于 ApiController 类。


public class ProductsController : ApiController
{
}

  接下来就来开使撰写针对 HTTP 动词 GET、POST、PUT、DELETE 对应的方法喽,但这里要注意一点,因为 Web API 是透过路由设定与上述的四种动词去进行判断指向哪一个方法,所以在方法的命名规则中都必须要使用 Get、Post、Put、Delete 这四种名称作为方法名称开头,如你真的不想遵守这个原则,你可以使用额外标注 [HttpGet]、[HttpPost]、[HttpPut]、[HttpDelete] 属性于方法名称上之方式定义。

查询方法


/// 
/// 取得所有产品清单
/// URI: /api/products
/// Method: GET
/// 
/// 
public IEnumerable GetAllProducts()
{
    return new ProductDao().GetProducts();
}

/// 
/// 取得指定编号产品
/// URI: /api/products/1
/// Method: GET
/// 
/// 
/// 
public Product GetProductById(int id)
{
    IEnumerable products = new ProductDao().GetProducts();
    var product = products.Where(p => p.Id == id);
    if (product.FirstOrDefault() != null)
        return product.First();
    else
        throw new HttpResponseException(HttpStatusCode.NotFound);
}

/// 
/// 取得指定类产品清单
/// URI: /api/products?category=MVC
/// Method: GET
/// 
/// 
/// 
public IEnumerable GetProductsByCategory(string category)
{
    IEnumerable products = new ProductDao().GetProducts();
    var cProducts = products.Where(p => p.Category == category);
    if (cProducts.FirstOrDefault() != null)
        return cProducts;
    else
        throw new HttpResponseException(HttpStatusCode.NotFound);
}

  以上三个方法都是作用于查询数据使用,其差异如下。

  • IEnumerable GetAllProducts():
    • GET,取得所有产品数据,URI 为 http://localhost:51370/api/Products 。
  • Product GetProductById(int id):
    • GET,取得指定产品数据,透过网址带入 ID 后交由 Web API 自动判断路由到指定方法,URI 为 http://localhost:51370/api/Products/1 。
  • IEnumerable GetProductsByCategory(string category):
    • GET,取得指定类数据,透过网址带入 Category 参数后交由 Web API 自动判断路由到指定方法,URI 为 http://localhost:51370/api/Products?category=MVC 。

  Web API 会自动透过网址与 HTTP 动词进行分析后再调用对应参数的网址,或者也能够自己额外定义新的路由位置。

新增方法


/// 
/// 新增产品数据后回传清单
/// URI: /api/products/name/category/price/stock
/// Method: POST
/// 
/// 
/// 
/// 
/// 
/// 
public IEnumerable PostProduct(string name, string category, string price, int stock)
{
    ProductDao productDao = new ProductDao();
    try
    {
        return productDao.InsertProduct(name, category, price, stock);
    }
    catch (Exception)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
}

  新增需要使用 POST 动词,除了以上的程序之外,我们还需要去 WebApiConfig.cs 中添加一个新增的路由设定,如下


config.Routes.MapHttpRoute(
    name: "InsertApi",
    routeTemplate: "api/{controller}/{name}/{category}/{price}/{stock}",
    defaults: new { name = RouteParameter.Optional }
);

  加入此路由设定后就能够使用 http://localhost:51370/api/Products/ASP.NET/WEB/300/10 此 URI 调用 Web API。

更新方法


/// 
/// 更新指定产品后回传清单
/// URI: /api/products/id/name/category/price/stock
/// Method: PUT
/// 
/// 
/// 
/// 
/// 
/// 
/// 
public IEnumerable PutProduct(int id, string name, string category, string price, int stock)
{
    ProductDao productDao = new ProductDao();
    try
    {
        return productDao.UpdateProduct(id, name, category, price, stock);
    }
    catch (Exception)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
}

  更新需要使用 PUT 动词,除了以上的程序之外,也需要跟新增一样增加 WebApiConfig.cs 中添加一个更新的路由设定,如下


config.Routes.MapHttpRoute(
    name: "UpdateApi",
    routeTemplate: "api/{controller}/{id}/{name}/{category}/{price}/{stock}",
    defaults: new { name = RouteParameter.Optional }
);

  加入此路由设定后就能够使用 http://localhost:51370/api/Products/1/ASP.NET/NET/350/10 此 URI 调用 Web API。

删除方法


/// 
/// 删除指定编号产品后回传清单
/// URI: /api/products/1
/// Method: DELETE
/// 
/// 
/// 
public IEnumerable DeleteProductById(int id)
{
    ProductDao productDao = new ProductDao();
    try
    {
        return productDao.DeleteProduct(id);
    }
    catch (Exception)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
}

  删除需要使用 DELETE 动词,此处就不需要额外添加路由,因为透过 DELETE 动词可以区分跟 GET 动词同样 http://localhost:51370/api/Products/1 网址的方法。

  当参考以上的程序处理完成后就可以开始测试看看,在此我使用 Fiddler 这个抓取封包的软件来测试,第一篇文章中也有提到下载点可以去下载用用看,测试如下

取得所有清单

取得编号1的产品

取得 MVC 类的产品

新增新产品

更新编号1产品

删除编号1产品

  以上就是测试后的画面,这边要注的是调用 URI 时使用的 HTTP Method 一定要正确,不然就会出现不允许用于存取路径的错误产生,如有遗漏的部分日后将在进行补充。

补充


  如要让 Web API 强制回传 JSON 格式,可参考保哥此篇文章 如何让 ASP.NET Web API 无论任何要求都响应 JSON 格式

范例程序


TWebApi_01.part1.rar

TWebApi_01.part2.rar

参考数据


Your First ASP.NET Web API (C#)

ASP.NET WEB API 心得笔记 (1)

[ASP.NET MVC] ASP.NET Web API (2) - 方法与路由




以上文章叙述如有错误及观念不正确,请不吝啬指教
如有侵权内容也请您与我反应~谢谢您 :)