04. Web API

İnternete bağlı diğer uygulamaların konuşması için geliştirilmiş bir ara yüzdür. Bu bölümde ASP.NET Core ile bir Web API yapmayı göreceğiz. Kodlarımızı yine Visual Studio Kod üzerinde yazacağız.

Aslında internetteki uygulamaların konuşması çok eski bir konudur. Örneğin, Web Servisleri benzer mantıkla çalışıyordu. Ama Web API’ler biraz daha geniş bir kavram ve genelde çıktı olarak genelde JSON üretiyor. Bir çıktı ürettiğine göre bunu üretmesi için bir GET isteği aklımıza gelmiştir. Öncelikle istek ve cevap türlerine bir bakalım.

API Tanımı Request kısmı Response kısmı
GET /api/todo Tüm verileri alır. Yok Bir Array Döndürür. (JSON olabilir.)
GET /api/todo/{id} Bir ID bağlı veri, veriler üretir. Yok Veri, Array
POST /api/todo Yeni bir veri ekleme Veri Veri
PUT /api/todo/{id} Var olan veriyi günceller Veri Yok
DELETE /api/todo/{id} Bir veriyi siler Yok Yok

Burada veri kelimesi genel bir sınıf nesnesi için kullanılmıştır. Örneğin bunun bir öğrenci verisi olduğunu düşünürsek içinde numarası, adı, soyadı ve bölümü gibi metinleri içerir. Sistemin çalışması kısaca aşağıdaki gibidir.

Bir API’ye istek geldiğinde Controller üzerinde karşılanır. Controller veritabanından kayıtları elde eder. Ardından modele göre kayıtlar serialize eder ve istemciye gönderir. Burada Serialize etmek demek JSON formatına (veya XML, hatta size özel bir formata) çevirmektir. İstemci tarafında bir programlama dili ile (örneğin Javascript) veri deserialize edilebilir.  Tabii gelen istek sadece veri istemeyebilir, veri eklemek, düzenlemek veya silmekte isteyebilir. Kısacası, veritabanından sadece read yapmaz, ayrıca write işlemi yapabilir.

04.01. Merhaba web API

Standart işlemleri hızlı bir şekilde yapmak için bir şablon üzerinden basit bir Web API’si uygulaması üreteceğiz. Burada örneği açıklayarak, Web API konusunu anlatacağız. Öncelikle boş bir klasör açın ve VS Code ile Open Folder diyerek bu boş klasörü açın. Yeni bir terminal yaratın ve aşağıdaki kodları çalıştırın.

Projemizin klasörleri ve dosyaları yaratıldı, debug işlemini başlatıp, bir sorun olup olmadığını test edelim. Debug sırasında tarayıcı açılınca adres çubuğuna:

https://localhost:5001/api/values

yazalım. Eğer [“value1″,”value2”] metnini tarayıcımızda gördüysek doğru yoldayız.

Yukarıdaki istek Controllers klasöründeki ValuesController.cs controller’ı tarafından cevaplandı. Bu sınıfı inceleyelim.

Her istek türü için ayrı bir controller yazılmıştır. ActionResult<IEnumerable<string>> türünden (bir string dizisi olduğunu belirtiyor) veri döndüren Get() metodu kullanılmıştır. [Route(“api/[controller]”)] URL kısmını yolu belirler. (https://localhost:5001/api/values) values controller’ın ismidir. Herhangi bir parametre olmadığı için direkt get() metodu çalışır. [ApiController] niteliği, Web API isteklerine cevap vereceğini gösterir.

Buradaki veriler statiktir. Şimdi basit bir Veritabanı uygulaması yapalım. Daha önceden SQL Server ve SQLite örnekleri yapılmıştı. Şimdi tüm veriyi memory’de tutacağız. Tabii bilgisayarı veya uygulamayı kapattığımızda verilerin uçacağını unutmayalım. Bu arada hızlı işlemler için memory kullanmak iyi bir çözümdür.

04.02. Models ve Context

Veritabanı için Models klasörünü ve TodoItem.cs dosyasını oluşturalım. Models klasörü yerine herhangi bir ismi kullanabilirdik, ancak MVC’den gelen alışkanlıkla genelde veri işlemleri için Models kullanıldığı için seçilmiştir.

Şimdi Veritabanı ile köprü görevi görecek Context’i oluşturalım. TodoContext.cs dosyasına aşağıdaki kodları oluşturalım.

Startup.cs dosyasına aşağıdaki kodları ekleyelim.

Artık bu memory Veritabanı ile konuşacak controller’a sıra geldi.

04.02. Controller

Controllers klasörüne TodoController.cs oluşturalım.

TodoController yapıcısı her HTTP isteğinde çalışır. İlk çalıştığında memory tablosu boş olduğu için 3 veri ekleyecektir ve memory’ye kaydedilmiştir. Henüz kodunuzu debug etmeyin, çünkü hiç metodumuz yok. Biri parametresiz ve biri parametreli iki GET metodu ile başlayalım. Bir önceki sınıf içine aşağıdaki kodları ekleyelim.

Şimdi debug zamanı. Tarayıcı açılınca GET isteklerimizi gönderelim.

  • https://localhost:5001/api/todo
  • https://localhost:5001/api/todo/2

Çıktılar:

  • [{“id”:1,”name”:”Item1″,”isComplete”:false},{“id”:2,”name”:”Item2″,”isComplete”:false},{“id”:3,”name”:”Item3″,”isComplete”:false}]
  • {“id”:2,”name”:”Item2″,”isComplete”:false}

Dönen değerler ASP.NET Core otomatik olarak nesneyi JSON şekline serialize eder ve JSON formatında istemciye gönderilir. Burada cevap kodu 200 değerindedir. Eğer URL üzerinden yapılan istek bulunmuyorsa cevap kodu 404 gönderir. Belirlenemeyen hatalar 5xx cevap kodunu döndürür.

Bir tarayıcı GET isteklerine cevap verebilir ancak POST, PUT ve DELETE isteklerine ne yazık ki cevap veremez. Bu işlemleri yapmak için API geliştirme için sıklıkla tercih edilen Postman uygulamasını kuracağız. Bu uygulamanın ekran çıktıları için tıklayın. Web API kişisel bilgisayarınızda ise File->Settings bölümden SSL certificate verification bölümünü kapatın. Yukarıdaki GET linklerini kopyalanın ve ilk testlerinizi yapın. Body bölümde sonuçlarınızı gördüyseniz diğer metotlara geçebilirsiniz.

Şimdi yeni bir veri eklemeye geldik. Öncelikle çalıştığımız Controller sınıfı içine aşağıdaki kodu ekleyelim.

Eklemeyi context üzerinden yapıp, sonucu tekrar döndüren bir koddur. Bu kodu yazdıktan sonra debug yapalım. Şimdi Postman üzerinden testimizi yapalım. Burada iki bölüm var. Params, Authorization, Headers, Body, Pre-request Script ve Test sekmelerini içeren bölüm istemci olarak düşünebiliriz. Yani verileri göndereceğimiz bölümdür. Body, Cookies, Headers ve Test Results sekmeleri içeren bölüm ise dönen sonuçları gösteren bölümdür. Birinci bölümün body sekmesini tıklayıp JSON (application/json) özelliğini seçin aşağıdaki JSON kodunu yapıştırın.

POST işlemini seçin “https://localhost:5001/api/todo” yazdıktan sonra SEND için her şey hazır, 201 created gördüyseniz işlem tamamdır. Tebrikler. POST işlemi de çalıştı. Şimdi tekrar GET yapıp kaydın eklenip eklenmediğini kontrol edebilirsiniz.

Şimdi bir PUT yani güncelleme işlemi yapalım. Aşağıdaki kodu sınıfa ekleyip debug edin.

Değiştirmek istediğimiz kaydın id değerini URL’ye ekleyelim. Örneğin,

https://localhost:5001/api/todo/1

Birinci bölümdeki Body sekmesinde JSON seçili iken aşağıdaki kodu yapıştırın.

Eğer 204 değerini gördü iseniz güncelleme işlemi de tamamdır. Silme için aşağıdaki kodu sınıfa ekleyin, debug edin ve silmek istediğiniz kaydın id’si yukarıdaki gibi URL’ye ekleyin.

Postman üzerinde çalıştırdığınızda 200 cevabı alırsanız, silme de başarılı ile yapılmıştır. Postman testlerinden başarılı ile geçtiysek şimdi bir web uygulamasından bu API’yi kullanmaya çalışalım. Aynı proje içinde bir çözüm üretmeyi amaçlıyorum.

04.03. API’yi JQuery üzerinden çağırma

Static dosya için wwwroot klasörünün kullanıldığını söylemiştik. Bu uygulama içinde olmadığı için sıfırdan kurmamız gerekir. wwwroot klasörünü aktive etmek için Startup.cs dosyasına Confiure metodu içine aşağıdaki satırları ekleyin.

wwwroot klasörü içine index.html dosyasını yaratalım ve aşağıdaki dosyaları kopyalayalım.

Şimdi bir debug edin ve index.html dosyasının çalıştığına emin olun. JQuery’den API’ye erişme kodlarımız site.js dosyasına yazacağız. site.js dosyasını da wwwroot klasörü içine yaratın.

Kod satırları açıklamalar yapıldı. Postman’le test ettiğimiz metotları AJAX-based bir şekilde sayfa yenilemeden Web API’leri bir web uygulaması üzerinden çağıralım. Postman üzerinden işlem sonuçlarını kontrol edebilirsiniz.

Bu bölüme kadar SQL Server, SQLite ve Memory tabanlı bir Veritabanı yarattık. Günümüzde NoSQL veritabanlarının popülerliği de son derece artmıştır. MongoDB JSON veri tutan en popüler veritabanlarından biridir. Bu güne kadar hiç kullanmadıysanız linkteki örneği incelemenizi öneririm.

Eğer bir Web API uygulaması geliştiriyorsanız, farklı metotları üretmek bir geliştirici için zordur. Swagger (OpenAPI) problemi çözmek için iyi dokümanlara sahip ve yardım sayfaları olan iyi bir çözümdür. Bu uygulama bir .Net Core çözümü değildir. Ancak, Swashbuckle.AspNetCore ve NSwag projeleri ASP.NET Core Web API’leri için dokümantasyon üretmek için açık kaynak kodlu olarak Swagger uygulamasının kullanıma olanak sağlar. Daha fazla bilgi için tıklayın.