ASP.NET Web API 1'de CRUD İşlemlerini Etkinleştirme

tarafından Mike Wasson

Tamamlanan Projeyi İndir

Bu öğreticide, ASP.NET 4.x için ASP.NET Web API'sini kullanarak http hizmetinde CRUD işlemlerinin nasıl desteklenmiş olduğu gösterilmektedir.

Öğreticide kullanılan yazılım sürümleri

  • Visual Studio 2012
  • Web API 1 (Web API 2 ile de çalışır)

CRUD, dört temel veritabanı işlemi olan "Oluşturma, Okuma, Güncelleştirme ve Silme" anlamına gelir. Birçok HTTP hizmeti, CRUD işlemlerini REST veya REST benzeri API'ler aracılığıyla da modeller.

Bu öğreticide, ürün listesini yönetmek için çok basit bir web API'sini oluşturacaksınız. Her ürün bir ad, fiyat ve kategori ("oyuncaklar" veya "donanım" gibi) ve bir ürün kimliği içerir.

Ürünler API'sinde aşağıdaki yöntemler kullanıma sunulacaktır.

Eylem HTTP yöntemi Göreli URI
Tüm ürünlerin listesini alma GET /api/products
Kimliğe göre bir ürün alma GET /api/products/id
Kategoriye göre ürün alma GET /api/products?category=category
Yeni ürün oluşturma POST /api/products
Bir ürünü güncelleştirme PUT /api/products/id
Ürün silme DELETE /api/products/id

Bazı URI'lerin yolda ürün kimliğini içerdiğine dikkat edin. Örneğin, kimliği 28 olan ürünü almak için istemcisi için http://hostname/api/products/28bir GET isteği gönderir.

Kaynaklar

Ürün API'leri iki kaynak türü için URI'leri tanımlar:

Kaynak URI
Tüm ürünlerin listesi. /api/products
Tek bir ürün. /api/products/id

Yöntemler

Dört ana HTTP yöntemi (GET, PUT, POST ve DELETE) CRUD işlemleriyle aşağıdaki gibi eşlenebilir:

  • GET belirtilen URI'de kaynağın gösterimini alır. GET'in sunucuda hiçbir yan etkisi olmamalıdır.
  • PUT belirtilen URI'deki bir kaynağı güncelleştirir. Put, istemcilerin yeni URI'ler belirtmesine izin veriyorsa belirtilen URI'de yeni bir kaynak oluşturmak için de kullanılabilir. Bu öğretici için API, PUT aracılığıyla oluşturmayı desteklemez.
  • POST yeni bir kaynak oluşturur. Sunucu yeni nesne için URI'yi atar ve yanıt iletisinin bir parçası olarak bu URI'yi döndürür.
  • DELETE, belirtilen URI'deki bir kaynağı siler.

Not: PUT yöntemi tüm ürün varlığının yerini alır. Yani istemcinin güncelleştirilmiş ürünün tam bir gösterimini göndermesi beklenir. Kısmi güncelleştirmeleri desteklemek istiyorsanız PATCH yöntemi tercih edilir. Bu öğretici PATCH uygulamaz.

Yeni Web API'si Projesi Oluşturma

Visual Studio'yu çalıştırarak başlayın ve Başlangıçsayfasından Yeni Proje'yi seçin. Alternatif olarak, Dosyamenüsünden Yeni'yi ve ardından Proje'yi seçin.

Şablonlar bölmesinde Yüklü Şablonlar'ı seçin ve Visual C# düğümünü genişletin. Visual C# altında Web'i seçin. Proje şablonları listesinde ASP.NET MVC 4 Web Uygulaması'nı seçin. Projeyi "ProductStore" olarak adlandırın ve Tamam'a tıklayın.

Menü seçeneklerini gösteren ve A S P nokta NET M V C 4 Web Uygulaması oluşturma yolunu vurgulayan yeni proje penceresinin ekran görüntüsü.

Yeni ASP.NET MVC 4 Projesi iletişim kutusunda Web API'sini seçin ve Tamam'a tıklayın.

Kullanılabilir şablonların kutulu görüntülerini gösteren ve Web A P I şablonunu mavi renkle vurgulayan yeni A S P nokta NET projesinin ekran görüntüsü.

Model Ekleme

Model, uygulamanızdaki verileri temsil eden bir nesnedir. ASP.NET Web API'sinde, kesin olarak yazılan CLR nesnelerini model olarak kullanabilirsiniz ve bunlar otomatik olarak istemci için XML veya JSON olarak serileştirilir.

ProductStore API'sinde verilerimiz ürünlerden oluştuğundan adlı Productyeni bir sınıf oluşturacağız.

Çözüm Gezgini henüz görünmüyorsa Görünüm menüsüne tıklayın ve Çözüm Gezgini'ı seçin. Çözüm Gezgini'da Modeller klasörüne sağ tıklayın. Bağlam menüsünde Ekle'yi ve ardından Sınıf'ı seçin. Sınıfı "Product" olarak adlandırın.

Sınıf ekle seçeneğini belirlemeye yönelik ek bir menü göstermek üzere modellerin seçimini vurgulayan çözüm gezgini menüsünün ekran görüntüsü.

Sınıfına aşağıdaki özellikleri Product ekleyin.

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

Depo Ekleme

Bir ürün koleksiyonu depolamamız gerekiyor. Koleksiyonu hizmet uygulamamızdan ayırmak iyi bir fikirdir. Bu şekilde, hizmet sınıfını yeniden yazmadan yedekleme deposunu değiştirebiliriz. Bu tür bir tasarım , depo düzeni olarak adlandırılır. Depo için genel bir arabirim tanımlayarak başlayın.

Çözüm Gezgini'da Modeller klasörüne sağ tıklayın. Ekle'yi ve ardından Yeni Öğe'yi seçin.

Modeller seçeneğini vurgulayan ve yeni öğe eklemek için bir menü getiren çözüm gezgini menüsünün ekran görüntüsü.

Şablonlar bölmesinde Yüklü Şablonlar'ı seçin ve C# düğümünü genişletin. C# bölümünde Kod'a tıklayın. Kod şablonları listesinde Arabirim'i seçin. Arabirimi "IProductRepository" olarak adlandırın.

Kod ve arabirim seçeneklerini gri renkle vurgulayan yüklü şablonlar menüsünü gösteren şablonlar bölmesinin ekran görüntüsü.

Aşağıdaki uygulamayı ekleyin:

namespace ProductStore.Models
{
    public interface IProductRepository
    {
        IEnumerable<Product> GetAll();
        Product Get(int id);
        Product Add(Product item);
        void Remove(int id);
        bool Update(Product item);
    }
}

Şimdi Models klasörüne "ProductRepository" adlı başka bir sınıf ekleyin. Bu sınıf arabirimini IProductRepository uygular. Aşağıdaki uygulamayı ekleyin:

namespace ProductStore.Models
{
    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;
        }
    }
}

Depo, listeyi yerel bellekte tutar. Bu, öğretici için uygundur, ancak gerçek bir uygulamada verileri bir veritabanı veya bulut depolama alanında harici olarak depolarsınız. Depo düzeni, uygulamayı daha sonra değiştirmeyi kolaylaştırır.

Web API Denetleyicisi Ekleme

ASP.NET MVC ile çalıştıysanız denetleyicileri zaten biliyorsunuz demektir. ASP.NET Web API'sinde denetleyici , istemciden gelen HTTP isteklerini işleyen bir sınıftır. Yeni Proje sihirbazı, projeyi oluştururken sizin için iki denetleyici oluşturdu. Bunları görmek için Çözüm Gezgini'da Denetleyiciler klasörünü genişletin.

  • HomeController, geleneksel bir ASP.NET MVC denetleyicisidir. Site için HTML sayfalarının sunulmasından sorumludur ve web API'mizle doğrudan ilişkili değildir.
  • ValuesController örnek bir WebAPI denetleyicisidir.

Çözüm Gezgini'da dosyaya sağ tıklayıp Sil'i seçerek ValuesController'ı silin. Şimdi aşağıdaki gibi yeni bir denetleyici ekleyin:

Çözüm Gezgini'da Denetleyiciler klasörüne sağ tıklayın. Ekle'yi ve ardından Denetleyici'yi seçin.

Denetleyici ekleme yolunu vurgulayan bir menü daha getiren denetleyiciler kategorisini vurgulayan çözüm gezgini menüsünün ekran görüntüsü.

Denetleyici Ekleme sihirbazında denetleyiciyi "ProductsController" olarak adlandırın. Şablon açılan listesinde Boş API Denetleyicisi'ni seçin. Daha sonra Ekle'ye tıklayın.

Yapı iskelesi seçenekleri altında, bir ad girmek için denetleyici adı alanını ve açılan şablonlar listesini gösteren denetleyici ekleme penceresinin ekran görüntüsü.

Not

Denetleyicilerinizi Denetleyiciler adlı bir klasöre yerleştirmeniz gerekmez. Klasör adı önemli değildir; kaynak dosyalarınızı düzenlemenin kolay bir yoludur.

Denetleyici Ekleme sihirbazı, Denetleyiciler klasöründe ProductsController.cs adlı bir dosya oluşturur. Bu dosya henüz açık değilse, açmak için dosyaya çift tıklayın. Aşağıdaki using deyimini ekleyin:

using ProductStore.Models;

IProductRepository örneğini barındıran bir alan ekleyin.

public class ProductsController : ApiController
{
    static readonly IProductRepository repository = new ProductRepository();
}

Not

Denetleyiciyi belirli bir uygulamasıyla IProductRepositorybağladığı için denetleyicide çağrı new ProductRepository() yapmak en iyi tasarım değildir. Daha iyi bir yaklaşım için bkz. Web API Bağımlılık Çözümleyicisi'ni kullanma.

Kaynak Alma

ProductStore API'sinde ÇEŞITLI "okuma" eylemleri HTTP GET yöntemleri olarak kullanıma sunulacaktır. Her eylem sınıfındaki bir yönteme ProductsController karşılık gelir.

Eylem HTTP yöntemi Göreli URI
Tüm ürünlerin listesini alma GET /api/products
Kimliğe göre bir ürün alma GET /api/products/id
Kategoriye göre ürün alma GET /api/products?category=category

Tüm ürünlerin listesini almak için sınıfına ProductsController şu yöntemi ekleyin:

public class ProductsController : ApiController
{
    public IEnumerable<Product> GetAllProducts()
    {
        return repository.GetAll();
    }
    // ....
}

Yöntem adı "Get" ile başlar, bu nedenle kural gereği GET istekleriyle eşler. Ayrıca, yöntemin parametresi olmadığından, yolda bir "id" kesimi içermeyen bir URI ile eşler.

Kimliğine göre bir ürün almak için bu yöntemi sınıfına ProductsController ekleyin:

public Product GetProduct(int id)
{
    Product item = repository.Get(id);
    if (item == null)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound); 
    }
    return item;
}

Bu yöntem adı da "Get" ile başlar, ancak yöntemin id adlı bir parametresi vardır. Bu parametre, URI yolunun "id" kesimiyle eşlenir. ASP.NET Web API çerçevesi, kimliği otomatik olarak parametresi için doğru veri türüne (int) dönüştürür.

GetProduct yöntemi, kimlik geçerli değilse HttpResponseException türünde bir özel durum oluşturur. Bu özel durum, çerçeve tarafından 404 (Bulunamadı) hatasına çevrilir.

Son olarak, ürünleri kategoriye göre bulmak için bir yöntem ekleyin:

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

İstek URI'sinde bir sorgu dizesi varsa, Web API'si sorgu parametrelerini denetleyici yöntemindeki parametrelerle eşleştirmeye çalışır. Bu nedenle, "api/products?category=category" formunun URI'sı bu yöntemle eşlenir.

Kaynak Oluşturma

Ardından sınıfına ProductsController yeni bir ürün oluşturmak için bir yöntem ekleyeceğiz. Yöntemin basit bir uygulaması aşağıdadır:

// Not the final implementation!
public Product PostProduct(Product item)
{
    item = repository.Add(item);
    return item;
}

Bu yöntemle ilgili iki şeye dikkat edin:

  • Yöntem adı "Post..." ile başlar. Yeni bir ürün oluşturmak için istemci bir HTTP POST isteği gönderir.
  • yöntemi Product türünde bir parametre alır. Web API'sinde, karmaşık türlerdeki parametreler istek gövdesinden seri durumdan çıkarılır. Bu nedenle, istemcinin XML veya JSON biçiminde bir ürün nesnesinin serileştirilmiş bir gösterimini göndermesini bekliyoruz.

Bu uygulama işe yarayacaktır, ancak tam olarak tamamlanmaz. İdeal olarak HTTP yanıtının aşağıdakileri içermesini isteriz:

  • Yanıt kodu: Varsayılan olarak, Web API çerçevesi yanıt durum kodunu 200 (Tamam) olarak ayarlar. Ancak HTTP/1.1 protokolüne göre bir POST isteği kaynak oluşturulmasıyla sonuçlandığında sunucunun 201 (Oluşturuldu) durumuyla yanıt vermesi gerekir.
  • Konum: Sunucu bir kaynak oluşturduğunda, yanıtın Konum üst bilgisinde yeni kaynağın URI'sini içermelidir.

ASP.NET Web API'si, HTTP yanıt iletisini işlemeyi kolaylaştırır. Geliştirilmiş uygulama şu şekildedir:

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

Yöntem dönüş türünün artık HttpResponseMessage olduğuna dikkat edin. Ürün yerine HttpResponseMessage döndürerek durum kodu ve Konum üst bilgisi de dahil olmak üzere HTTP yanıt iletisinin ayrıntılarını denetleyebilirsiniz.

CreateResponse yöntemi bir HttpResponseMessage oluşturur ve yanıt iletisinin gövdesine Product nesnesinin serileştirilmiş bir gösterimini otomatik olarak yazar.

Not

Bu örnek doğrulamaz Product. Model doğrulama hakkında daha fazla bilgi için bkz. ASP.NET Web API'sinde Model Doğrulama.

Kaynağı Güncelleştirme

BIR ürünü PUT ile güncelleştirmek kolaydır:

public void PutProduct(int id, Product product)
{
    product.Id = id;
    if (!repository.Update(product))
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
}

Yöntem adı "Put..." ile başlar, bu nedenle Web API'si bunu PUT istekleriyle eşleştirir. yöntemi iki parametre alır: ürün kimliği ve güncelleştirilmiş ürün. Id parametresi URI yolundan alınır ve ürün parametresi istek gövdesinden seri durumdan çıkarılır. Varsayılan olarak, ASP.NET Web API çerçevesi rotadan basit parametre türlerini ve istek gövdesinden karmaşık türleri alır.

Kaynak Silme

Bir kaynağı silmek için "Sil..." tanımlayın Yöntem.

public void DeleteProduct(int id)
{
    Product item = repository.Get(id);
    if (item == null)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }

    repository.Remove(id);
}

DELETE isteği başarılı olursa, durumu açıklayan bir varlık gövdesiyle durum 200 (Tamam) döndürebilir; silme işlemi hala bekleniyorsa durum 202 (Kabul Edildi); veya varlık gövdesi olmayan durum 204 (İçerik Yok). Bu durumda yöntemin DeleteProduct dönüş void türü vardır, bu nedenle ASP.NET Web API'sinin bunu otomatik olarak 204 (İçerik Yok) durum koduna çevirmesi gerekir.