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を作成します.
Modelsフォルダの下にProductRepository.csを作成します.
注意:リポジトリ内のローカルメモリに保持されているリスト.実際のアプリケーションでは、格納されたデータを外部、任意のデータベース、またはクラウドストレージに保存します.リポジトリ・モードを使用すると、変更後の実装が容易になります.
コントローラの変更
前回のブログで紹介した項目ですので、ここではControllersファイルの下にあるProductController.csを修正します.
注:以上はパッケージデータベースの倉庫保管操作方式を採用しています.
結び目
先に紹介したように、WebApiアプリは難しくないようです.実は、ODataなどの高級な使用はまだ説明されていません.WebApiはWebServiceに似ており、WCF技術を「淘汰」するために生まれたようだという人もいる.しかし、WCFほど強くはありませんが、使いやすいだけです.
はい.このセクションでは、インタフェースの表示方法を説明していません.私もこの技術を勉強しています.まず公式の例を見てから、完全なDEMOを作ります.
前言
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を作ります.