ASP.NET Web API(C#)は簡単な添削を実現する

24783 ワード

最近web Apiを勉強して、自分で1つの小さい例を作りました


1.vs 2015でASPを新規作成する.NET WEBアプリケーションプロジェクト
2.「新ASP.NET MVC 4プロジェクト」ダイアログボックスで、「Web API」を選択し、「OK」をクリック
3.Modelsフォルダでモデルを追加
  はProductと命名された.cs
Productを編集します.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

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

4.倉庫類の追加
Modelsフォルダに、IProductRepositoryという名前の倉庫インタフェースクラスを追加し、編集します.
ModelsフォルダにProductRepositoryを追加します.csクラスは、このインタフェースを実装するために使用されます.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace HelloWebApi2.Models
{
    public class ProductRepository : IProductRepository
    {
        private List<Product> products = new List<Product>();
        private int _nextId = 1;
        //     
        public ProductRepository()
        {
            Add(new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 });
            Add(new Product { Id = 2, Name = "Yp-yo", Category = "Yoys", Price = 3.75M });
            Add(new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M });
        } 
        //  id    
        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 IEnumerable<Product> GetAll()
        {
            return products;
        }

        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;
        }
    }
}

5.コントローラを追加Controllersフォルダに、ProductsControllerというコントローラを追加します.
注意:このコントローラはApiControllerに継承されます.
using HelloWebApi2.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;

namespace HelloWebApi2.Controllers
{
    public class ProductsController : ApiController
    {
        // GET: Products

        static readonly IProductRepository repository = new ProductRepository();

        public IEnumerable<Product> GetAllProducts()
        {
            return repository.GetAll();
        }
        public Product GetProduct(int id)
        {
            Product item = repository.Get(id);
            if (item == null)
            {
                //throw new HttpResponseException(HttpStatusCode.NotFound);
                throw new Exception("   id   !");

            }
            return item;
        }
        public IEnumerable<Product>GetProductsByCategory(string category)
        {
            return repository.GetAll().Where(p => string.Equals(p.Category, category, StringComparison.OrdinalIgnoreCase));
        }

        public HttpResponseMessage PostProduct(Product item)
        {
            item = repository.Add(item);
            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;
        }
        //Update
        public void PutProduct(int id,Product product)
        {
            product.Id = id;
            if (!repository.Update(product))
            {
                //throw new HttpResponseException(HttpStatusCode.NotFound);
                throw new Exception("       !");
            }

        }
        //Delete
        public void DeleteProduct(int id)
        {
            Product item = repository.Get(id);
            if (item == null)
            {
                //throw new HttpResponseException(HttpStatusCode.NotFound);
                throw new Exception("       !");
            }
            repository.Remove(id);
        }
    }
}

6.次に、ビューの作成を開始し、各メソッドのテストを容易にする前に、メソッドの要求のタイプ(メソッドの先頭に依存)と、メソッドを要求するurlを識別するコメントがあります.
これらのurlは規則的で、下図を参照:cshtml、すべての初期内容を削除し、次の内容に変更します.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta name="viewport" content="width=device-width" />
    <title></title>
</head>
<body>
    <script src="~/Scripts/jquery-1.10.2.min.js"></script>
    <script> $(document).ready(function () { var load = function () { $("#products").empty(); $.getJSON("/api/products/", function (data) { $.each(data, function (key, val) { var str = val.Name + ':$' + val.Price; var ele = $("<li id=" + val.Id + ">" + "<strong>" + val.Id + "</strong>" +". "+ str + "</li>") ele.appendTo($('#products')); }); }); }; load(); //           var Product = { create: function () { Id: ""; Name: ""; Category: ""; Price: ""; return Product; } } //           :POST   url: /api/Products //   ProductsController.cs   public HttpResponseMessage PostProduct(Product item)    $("#addItem").click(function () { var newProduct = Product.create(); newProduct.Name = $("#name").val(); newProduct.Category = $("#category").val(); newProduct.Price = $("#price").val(); $.ajax({ url: "/api/Products", type: "POST", contentType: "application/json; charset=utf-8", data: JSON.stringify(newProduct), success: function () { alert("    !"); load(); }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert("    ,  :" + textStatus + " " + errorThrown); } }); }); //   Id         :GET   url: /api/Products/Id //   ProductsController.cs   public Product GetProduct(int id)    $("#showItem").click(function () { var inputId = $("#id2").val(); $("#name2").val(""); $("#category2").val(""); $("#price2").val(""); $.ajax({ url: "/api/Products/" + inputId, type: "GET", contentType: "application/json; charset=urf-8", success: function (data) { $("#name2").val(data.Name); $("#category2").val(data.Category); $("#price2").val(data.Price); load(); }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert("    ,  :" + textStatus + " " + errorThrown); } }); }); //   Id        :PUT   url: /api/Products/Id //   ProductsController.cs   public void PutProduct(int id, Product product)    $("#editItem").click(function () { var inputId = $("#id2").val(); console.log(inputId) var newProduct = Product.create(); newProduct.Name = $("#name2").val(); newProduct.Category = $("#category2").val(); newProduct.Price = $("#price2").val(); $.ajax({ url: "/api/Products/" + inputId, type: "PUT", data: JSON.stringify(newProduct), contentType: "application/json; charset=urf-8", success: function () { alert("    ! "); load(); }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert("    ,  :" + textStatus + " " + errorThrown); } }); }); //    Id        :DELETE   url: /api/Products/Id //   ProductsController.cs   public void DeleteProduct(int id)    $("#removeItem").click(function () { var inputId = $("#id2").val(); $.ajax({ url: "/api/Products/" + inputId, type: "DELETE", contentType: "application/json; charset=uft-8", success: function (data) { alert("Id  " + inputId + "        !"); load(); }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert("    ,  :" + textStatus + " " + errorThrown); } }); }); }); </script>
    <div id="body">
        <div>
        <h1>All Products</h1>
        <ul id="products"></ul>
    </div>
        <section>
            <h2>    </h2>
            Name:<input id="name" type="text" /><br />
            Category:<input id="category" type="text" />
            Price:<input id="price" type="text" /><br />
            <input id="addItem" type="button" value="  " />
        </section>

        <section>
            <br />
            <br />
            <h2>    </h2>
            Id:<input id="id2" type="text" /><br />
            Name:<input id="name2" type="text" /><br />
            Category:<input id="category2" type="text" />
            Price:<input id="price2" type="text" /><br />
            <input id="showItem" type="button" value="  " />
            <input id="editItem" type="button" value="  " />
            <input id="removeItem" type="button" value="  " />
        </section>

    </div>
</body>
</html>

6.最終的な効果は以下の通りです.