ASP.NET WebApi増删改查

7121 ワード

本編は、前編『ASP.NET WebApi入門』に続いてご紹介します.
前言
     CRUD操作は、「作成、読み取り、更新、削除」の4つの基本的なデータベース操作を意味すると言われています.多くのHTTPサービスは、RESTのApiを介してCRUD操作を行う.このチュートリアルでは、製品のリストを管理するために非常に簡単なWeb APIを生成します.各製品には、名前、価格、カテゴリが含まれ、製品idが追加されます.アクセスUriは次のように対応します.
アクション
HTTPメソッド
相対URI
すべての製品のリストを取得
GET
/api/Product
IDによって一つの製品を得る
GET
/api/Product/id
Categoryによる製品リストの取得
GET
/api/Product?Category=カテゴリ
新しい製品を作成
POST
/api/Product
IDによる製品の更新
PUT
/api/Product/id
IDによる製品の削除
DELETE
/api/Product/id
倉庫の追加
      Modelsフォルダで、IProductRepository.csを作成します.      
using System.Collections.Generic;



namespace ApiDemo01.Models

{

    /// <summary>      </summary>

    public interface IProductRepository

    {

        IEnumerable<Product> GetAll();

        Product Get(int id);

        Product Add(Product item);

        void Remove(int id);

        bool Update(Product item);

    }

}


Modelsフォルダの下にProductRepository.csを作成します.
using System;

using System.Collections.Generic;



namespace ApiDemo01.Models

{

    /// <summary>      </summary>

    public class ProductRepository : IProductRepository

    {

        private List<Product> products = new List<Product>();

        private int _nextId = 1;



        public ProductRepository()

        {

            Add(new Product { Name = "Tomato soup", Category = "Groceries", Price = 1.39M });

            Add(new Product { Name = "Yo-yo", Category = "Toys", Price = 3.75M });

            Add(new Product { Name = "Hammer", Category = "Hardware", Price = 16.99M });

        }



        public IEnumerable<Product> GetAll()

        {

            return products;

        }



        public Product Get(int id)

        {

            return products.Find(p => p.ID == id);

        }



        public Product Add(Product item)

        {

            if (item == null)

            {

                throw new ArgumentNullException("item");

            }

            item.ID = _nextId++;

            products.Add(item);

            return item;

        }



        public void Remove(int id)

        {

            products.RemoveAll(p => p.ID == id);

        }



        public bool Update(Product item)

        {

            if (item == null)

            {

                throw new ArgumentNullException("item");

            }



            int index = products.FindIndex(p => p.ID == item.ID);

            if (index == -1)

            {

                return false;

            }

            products.RemoveAt(index);

            products.Add(item);

            return true;

        }

    }

}


注意:リポジトリ内のローカルメモリに保持されているリスト.実際のアプリケーションでは、格納されたデータを外部、任意のデータベース、またはクラウドストレージに保存します.リポジトリ・モードを使用すると、変更後の実装が容易になります.
コントローラの変更
      前回のブログで紹介した項目ですので、ここではControllersファイルの下にあるProductController.csを修正します. 
using ApiDemo01.Models;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Net.Http;

using System.Web.Http;



namespace ApiDemo01.Controllers

{

    public class ProductController : ApiController

    {

        //TODO:        (    MEF,            )

        static readonly IProductRepository repository = new ProductRepository();



        //      

        public IEnumerable<Product> GetAllProducts()

        {

            return repository.GetAll();

        }



        //  ID      

        public Product GetProduct(int id)

        {

            Product item = repository.Get(id);

            if (item == null)

            {

                throw new HttpResponseException(HttpStatusCode.NotFound);

            }

            return item;

        }



        //          

        public IEnumerable<Product> GetProductsByCategory(string category)

        {

            return repository.GetAll().Where(

                p => string.Equals(p.Category, category, StringComparison.OrdinalIgnoreCase));

        }



        //      

        //     ,Web API              200 (OK)。

        //    HTTP/1.1    ,  POST             ,           201 (   )。



        //          ,                    URI。



        //public Product PostProduct(Product item)

        //{

        //    item = repository.Add(item);

        //    return item;

        //}



        //         

        //       HttpResponseMessage。

        //    HttpResponseMessage     ,        HTTP     ,                。

        public HttpResponseMessage PostProduct(Product item)

        {

            item = repository.Add(item);

            //   HttpResponseMessage ,                            。

            var response = Request.CreateResponse<Product>(HttpStatusCode.Created, item);



            string uri = Url.Link("DefaultApi", new { id = item.ID });

            response.Headers.Location = new Uri(uri);

            return response;

        }



        //  ID      

        public void PutProduct(int id, Product product)

        {

            product.ID = id;

            if (!repository.Update(product))

            {

                throw new HttpResponseException(HttpStatusCode.NotFound);

            }

        }



        //  ID      

        public void DeleteProduct(int id)

        {

            Product item = repository.Get(id);

            if (item == null)

            {

                throw new HttpResponseException(HttpStatusCode.NotFound);

            }



            repository.Remove(id);

        }

    }



    #region                 ,     

    //public class ProductController : ApiController

    //{

    //    //    

    //    List<Product> pList = new List<Product>

    //    { 

    //        new Product{ID=1, Name="Dell", Category="  " , Price=3500 },

    //        new Product{ID=2, Name="Apple", Category="  " , Price=5500 },

    //        new Product{ID=3, Name="HP", Category="  " , Price=3000 }

    //    };



    //    //      

    //    public IEnumerable<Product> GetProducts()

    //    {

    //        return pList;

    //    }



    //    //    ID      

    //    public IHttpActionResult GetProduct(int id)

    //    {

    //        var product = pList.FirstOrDefault((p) => p.ID == id);

    //        if (product == null)

    //        {

    //            return NotFound();

    //        }

    //        return Ok(product);

    //    }

    //} 

    #endregion

}


注:以上はパッケージデータベースの倉庫保管操作方式を採用しています.
結び目
      先に紹介したように、WebApiアプリは難しくないようです.実は、ODataなどの高級な使用はまだ説明されていません.WebApiはWebServiceに似ており、WCF技術を「淘汰」するために生まれたようだという人もいる.しかし、WCFほど強くはありませんが、使いやすいだけです.
       はい.このセクションでは、インタフェースの表示方法を説明していません.私もこの技術を勉強しています.まず公式の例を見てから、完全なDEMOを作ります.