akoselioren / Electrical-Appliances-Store-RESTful-Api

RESTful Web API - .Net Core - Entity Framework Core - N-Tier Architecture - MSSQL - DTO - AutoMapper - Fluent Validation - Middleware - DI Container - Postman – Nlog – UseException Handler – Content Negotiation – Async – Action Filters – Pagination – Filtering – Searcing – Sorting – Data Shaping – Hateoas – Options and Head – Root Documentation –

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

🌟 Electrical Appliances Store RESTful Web Api 🌟

🟢Proje hakkında özet bilgi :

• Gelişmiş ve olgunlaşmış bir Web Api için içinde barındırdığı sayfalama, filtreleme, sıralama ve içerik pazarlığı olmak üzere Api güvenliği, ön belleğe alma, hız sınırlandırma gibi pek çok yapıyı içinde barındıran ileri düzey bir Web Api geliştirdim.

• Web api için Asp.Net Core 6.0 Versionunu kullanarak Katmanlı mimari üzerinde projeyi oluşturup, geliştirdim.

• Projenin geniş kapsamlı anlatımını yalın ve güncel bir şekilde aşağıda yaparak görseller ile destekledim, hızlı bir şekilde inceleyebilirsiniz.


Resttasarım


🟠 Proje Görselleri ve Açıklamaları 🟠


🔶 1 - Entity Framework Core

• Entity Framework Core .Net nesneleri kullanarak bir veri tabanıyla çalışmaya olanak tanıyan ve Microsoft tarfından geliştirilmiş bir ORM teknolojisi aracıdır.

• Genel olarak yazılması gereken veri erişim kodunun çoğuna olan ihtiyacı ortadan kaldırır ve otomatik üretir.

• Bu projede SQL veri tabanı için CodeFirst yaklaşımı ile EF Core'un sağlamış olduğu yapıları kullanarak veri tabanı işlemlerimi tamamlamış oldum.


🔶 2 - Yazılım Mimarisi (Software Architecture)

• N-tier Architecture mimarisi ile 'Entities', 'Presentation', 'Repositories', 'Services' katmanları ile uygulamanın yönetimini ayrı, sade ve yalın bir şekilde yapılabilmesine imkan vermektedir.

• Katmanlı mimari ile her katmanın sorumluluğu ayrılmaktadır, bu şekilde proje büyüdükçe karmaşıklığın önüne geçilerek katmanların daha temiz çalışması ve uygulama noktasında Api'ın niteliğini arttıracak şekilde geliştirilmesine imkan sağlamaktadır.


🔶 3 - NLog Uygulaması (NLog Implementation)

• NLog kütüphanesini mimariye dahil ederek loglama işlemlerini gerçekleştirdim.

• Kullanıcının atmış olduğu Requestlerin karşılığı olmadığında bunu bir txt uzantılı dosyaya loglamanın gerçekleştiği tarih ile beraber kaydederek istediğimiz zaman inceleyebilmek için loglarını alıyoruz.


1


🔶 4 - Global Hata Yönetimi (Global Error Handling)

• Hatalı istek(Request) atıldığında Global Hata yönetimi ile yazmış olduğumuz Custom Error Messages bize göstererek çözüme daha hızlı ulaşmamızı sağlamaktadır.

• Aşağıdaki resimde'de görüldügü gibi bu bize 0' id'li ürünü görmek istediğimizde bize hata mesajı veriyor.


2


🔶 5 - AutoMapper

• İki nesneyi birbirine eşleyen karmaşık koddan kurtulmak için oluşturulan bir kütüphanedir.

• Oluşturduğumuz DTO(Data Transfer Object) üzerindeki dataları bir Destination'a Otomatik olarak Map'liyoruz yada kopyalıyoruz. Bu işlemin terside söz konusu olabilir Destination'dan DTO'ya gidilebilir.

• Mapping Profile ile hangi nesne hangi nesneye Map'leneceğini belirliyoruz.


🔶 6 - İçerik Pazarlığı (Content Negotiation)

• Bir Api geliştirdikten sonra çok sayıda kullanıcımızında olduğunu varsayarsak bu Api ile farklı uygulamalarla konuşabiliriz yada iletişim içinde olabiliriz yada doğrudan bizim Api'mizi tüketen istemcilerimiz olabilir, yani Clientlerimiz olabilir.

• Client'lar bize Request attığında eğerki bizim Apimiz içerik pazarlığına kapalıysa sadece tek tip Response dönüşü sağlayabilir.

• Bizim Api'miz içerik pazarlığına açık olduğu için bize gelen Requestlere 'text/csv', 'application/xml', 'application/json' vb. formatlarda Response sağlayabiliriz.


🟢 6.1 - text/xml


3xml


🟢 6.2 - application/json


4json


🟢 6.3 - application/xml


5xml


🔶 7 - Doğrulama (Validation)

• Veri manipulasyonu yaptığımız zaman tanımladığımız bir dizi kural setinin ilgili varlıklar üzerinde uygulanmasını sağlamaktadır.

• Client ile Server arasında data alışverişi gerçekleşeceği zaman bu veriler üzerinde tanımladığımız kuralların geçerli olup olmadığını kontrol etmemize olanak sağlar.


🟢 7.1 - Post Validation işlemi Price ve Title Validation Hatası


7_1validationpost


🟢 7.2 - Post Validation işlemi Price Validation Hatası


7_2validationpost


🟢 7.3 - Post Validation işlemi Title Validation Hatası


7_3validationpost


🟢 7.4 - Put Validation işlemi Price ve Title Validation Hatası


7_4validationput


🟢 7.5 - Put Validation işlemi Title Validation Hatası


7_5validationput


🟢 7.6 - Put Validation işlemi Price Validation Hatası


7_6validationput


🔶 8 - Asenkron Kod (Asynchronous Code)

• .Net yapısında 3 farklı asenkron programlama modeli vardır, bunlar ;

• Asynchronous Programming Model (APM)

• Event-based Asynchronous Pattern(EAP)

• Task-based Asynchronous Pattern(TAP)

• Projeyi Task-based Asynchronous Pattern(TAP) yani Görev tabanlı programlama modeli ile geliştirdim.

• Bizim Api'mize İstemcilerden Request geldiğinde bizim Thread Pool'umuz yani görev havuzumuzda sırasını bekleyerek sırayla işleme alınır eğer havuz dolu ise istek(Request) bekletilir ve buna Senkron Programlama denir.

• Asenkron programlamada ise gelen Requestler beklemez ve başka bir Request işlemdeyken diğer Requestler'de işlemlerine devam eder, bu durumda Asenkron(Async) Programlama performans açısından bize katkı sağlar.

• async, await ve Task Keywordleri ile tanımlanır.


13_1


🔶 9 - Eylem Filtreleri (Action Filters)

• Action Filter bir Controller ya da Controller içindeki Action yapısına uygulanan ve bu yolla ilgili yapının düzenlenmesine olanak sağlayan bir attribute olarak ifade edilir. Action Filter'ler ;

• Authorization filters

• Resource filters

• Action filters

• Exception filters

• Result filters

• gibi yapılardan oluşmaktadır. Genel olarak yazılan Controller'ların başına yazılır.


🔶 10 - Sayfalama (Pagination)

• Sayfalama kısaca Api'den dönen Response'lerin kısmi olarak alınmasıdır. RESTful Api tasarımı için önemli bir özelliktir.

• İstediğimiz datalar çok büyük bir şekilde tutuluyor olabilir fakat bize sadece bazı datalar gerekli ise bu dataların hepsini çağırmamız sunucu ve istemci açısından zaman olarak maaliyet oluşturcaktır, ama sayfalama yaparak veriyi parça parça halinde görüntüleyebilmekteyiz.

🟢 10.1 - Sayfalama işlemleri


• Resimdede görüdüğü gibi pageNumber vererek hangi sayfayı görmek istediğimizi belirtmiş oluyoruz.

• pageSize özelliği ile bir sayfada kaç adat veri olacağını belirliyoruz.


10_1


🟢 10.2 - Sayfa Detay bilgisi


• CurrentPage: Bulunduğumuz sayfa

• TotalPage: Toplam sayfa sayısı

• PageSize: Her sayfada listelenen veri sayısı

• TotalCount: Toplam veri sayısı

• HasPrevious: Bulunduğumuz sayfanın öncesinde bir sayfa varmı onun bilgisini verir varsa true yoksa false olarak gösterir.

• HasPage: Bulunduğumuz sayfanın sonrasında bir sayfa varmı onun bilgisini verir varsa true yoksa false olarak gösterir.


10_2pagedlist


🔶 11 - Filtreleme (Filtering)

• Yalın olarak Filtreleme bir takım kriterlere bağlı olarak sonuçların getirilmesini sağlayan bir mekanizmadır.

• Query String yada Route ifadeleri ile gerçekleştirikmektedir.

• Aşağıdaki resimde'de görüldüğü üzere Api'nin price özelliğinde belli araklıktaki değere sahip dataları bize göstermektedir.


11filtering


🔶 12 - Arama (Searching)

• Arama bir terim ya da anahtar değer yardımıyla uygulama içerisindeki en alakalı sonuçları döndürmek üzere uygulanan bir işlevdir.

• Arama işlemi duruma göre bir kaynak yada birden fazla kaynak üzerinde yapılabilir.

• Aranan kelime büyük küçük harf'e duyarsızdır, kelime ve datalar bu şekilde karşılaştırılır.


11search


🔶 13 - Sıralama (Sorting)

• Sorting query string parametreleri yardımıyla tercih edilen bir yolla sonuçların sıralanması işlevidir.

• OrderBy query string ile DESC yada ASC olarak sıralama yapılabilir.


🟢 13.1 - Büyükten küçüğe doğru(DESC) sıralama


12short


🟢 13.2 - Küçükten büyüğe doğru(ASC) sıralama


12short2


🔶 14 - Veri Şekillendirme (Data Shaping)

• Data Shaping API tüketicisinin, sorgu dizesi aracılığıyla talep ettiği nesnenin alanlarını seçerek sonuç setini şekillendirmesini sağlar.

• API tasarımı ve ihtiyacına göre eklenebilir.


14_2


🔶 15 - HATEOAS

• Bir rest servisinin response üzerinden tüm içerik bilgilerini görebildiğimiz başka bir kaynağa ya da dökümana gerek kalmadan kullanabilmeye olanak sağlayan bir araçtır. Örnek verecek olursam bir kişinin kaydını getirmek için rest üzerinden gelen cevabın içerisinde o restin diğer yapabileceği tüm yeteneklerinde görülebileceği bir yapı sağlamaktadır. Projemizde başka Rest işlemleri eklediysek silme, güncelleme gibi işlemleri yapabilmek için hangi rest yolunun kullanılması gerektiği gibi bilgileri görüntüler.

• İyi geliştirilmiş bir API başlangıçta Hyper Media desteği sunmamış olsada sonradan kolaylıkla projeye dahil edilebilir.

• Hyper Media destegi vermek zorunlu değildir API'nin ihtiyacı var ise duruma göre proje'ye dahil edilmelidir.


15


🔶 16 - Versiyonlama (Versioning)

• API geliştirilirken gelişim sürecinde her ne kadar iş odaklı bir çalışma gerçekleştiriyor olsakta, öngörülemeyen yada sonradan ortaya çıkan ihtiyaçlar ile API' ımızı daha fazla sorumluluk eklememiz gerekebilmektedir. İşte böyle bir durumda yapılan değişikliklerde API'ların istemciler üzerindeki etkisini yönetebilmek ve operasyonel olarak gerçekleştirilen çalışmayı raporlayabilmek için her bir güncelleme neticesinde API’ları versiyonlamamız gerekmektedir.


🟢 16.1 - Controller Route ile v1 Versiyonlama


18v1


🟢 16.2 - Controller Route ile v2 Versiyonlama


18v2


🟢 16.3 - Header ile 1.0 Versiyonlama


18v1_header


🟢 16.4 - Header ile 2.0 Versiyonlama


18v2_header


🔶 17 - Önbelleğe Alma (Caching)

• Bir Api'nin hem kalitesini ve hemde performansını artırmak ihtiyacı duyuyorsak temel nitekiklerden biride Api'nin veriyi ön belleğe alma mekanizmasını işleterek bu niteliğe sahip olmasıdır.

• Caching, özet olarak gerekli isteklerin ayırt edilebilmesidir.

• REST mimarisi üzerinde Client ile Server arasındaki Requestlerde Cache mekanizması ile ilk kez gönderdiği Request'ten sonra veri Cache'de tutulmaya başlanır, aynı Request tekrar atıldığında Server ile iletişime geçilmeden eğer belirlediğimiz belli süreyi(Cache-control: max-age:) aşmadıysa Cache mekanizmasından Response edilir. Bu durum Server'ımızın trafiğini azaltmamızda performans olarak çok büyük katkı sağlamaktadır.


• Cache-Control ile refresh süresini görebiliyoruz.

• ETag ile cache için Header'da tutulan referans adını görebiliyoruz.

• Last-Modified : oluşturulduğu tarih.

• Expires : sonlanacağı tarih tarih.


19


🔶 18 - Hız Sınırlama ve Kısıtlama (Rate Limit and Throttling)

• Client'dan gelen Requestleri dakikalık olarak belli bir sınırda tutmamızı sağlamaktadır. İstemci'nin isteklerini sınırlayıp serverin trafiğini kontrol altına alarak performans maaliyeti açısından bize çok fayda sağlamaktadır.


• Aşağıdaki resimde de görüldüğü gibi ;

• X-Rate-Limit-Limit : 1m / istemciye vermiş olduğumuz 1 dk boyunca toplam istek süresidir.

• X-Rate-Limit-Remaining : İstemciye 1 dk içinde verdiğimiz istek adedi'dir. Bu sayı 1 dk içinde 10 adettir ve Geliştiricinin isteğine göre değiştirilebilir. Süresi dolunca tekrardan yenilenir.

• X-Rate-Limit-Reset : Burada da istemci istek hakkını doldurmamış olsa dahi bu süre dolunca otomatik olarak resetlenir ve tekrardan 10 adet istek yani Request atabilir.


20


• Aşağıdaki resimde de görüldüğü gibi ;

• Burada Request(istek) sınırını dolduran client'a hata mesajı veriyoruz ve bize sunucumuz Status Code: '429 Too Many Requests' cevabı ile dönüş yapıyor.


20 hata


🔶 19 - JWT, Identity ve Refresh Token

• Oturum açma ve yetkilendirme işlemleri için Identity çerçevesini kullanarak bu yapıyı tasarlamış olduk.

• Role bazlı oturum açma işlemleri için 3 rol belirkedik ve bunlar;

• Admin, User ve Editör olarak tanımladık. aralarındaki fark ise şöyleki Admin kullanıcısı istediği her yere istek atabiliyorken, User ve Editör kullanıcısı için sadece gerekli yerlere istek atabilmektedirler.


🟢 19.1 - Register işlemi

• Aşağıdaki resimde görüldüğü gibi yeni kullanıcı kayıt işlemi yapıyoruz ve en alttada rolünü belirliyoruz.

• Bize Status Code: 201 Created ile dönüş yapıyor, kayıt işlemi başarılı.


21_yenikayit


🟢 19.2 - Giriş işlemi

• Aşağıdaki resimde görüldüğü gibi daha önceden oluşturmus oldugum admin kullanıcısı ile sisteme giriş yapıyoruz.

• Bize Status Code: 200 OK ile dönüş yapıyor, giriş işlemi başarılı.


21_giriş


🟢 19.3 - Kullanıcı girişi yapılmadan Request işlemi

• Aşağıdaki resimde görüldüğü gibi sistemde hiç aktif olmadan direk request atancı bize sonuçları döndürmüyor.

• Bize Status Code: 401 Unauthorized ile dönüş yapıyor, giriş işlemi başarısız oluyor ve istek cevap alamıyor.


21girisyapmalısınhatası


🟢 19.4 - Yetkisiz kullanıcının Request işlemi

• Aşağıdaki resimde görüldüğü gibi yetkisi olmayan kullanıcı 1'nolu ürünün güncelleme işlemini yapmak için istek gönderiyor.

• Bize Status Code: 403 Forbidden ile dönüş yapıyor, yetkisiz işlem başarısız oluyor ve istek cevap alamıyor.


21_kullanıcıhata


🟢 19.5 - Refresh Token işlemi

• Aşağıdaki resimde görüldüğü gibi daha önceden Login olan kullanıcımızın Token süresi dolunca yeniden bizim access token ve refresh token'imizi göndererek süresi yeniliyoruz.

• Bize Status Code: 200 OK ile dönüş yapıyor, refresh token yenileniyor ve veritabanına ekleniyor.


21refresh


🔶 20 - Veritabanı Diagramı

• Veritabanındaki bütün tabloların, kolonların ve tablo ilişkilerinin yapısı aşağıdaki resimde gösterilmiştir.


databaseddiagrams


🟠 Yararlanılan Kaynaklar 🟠



🟠 Projenin Kurulumu 🟠


• Github'dan projeyi indirip, Visual Studio'da açtıkdan sonra WebApi Katmanında bulunan appsettings.json dosyasına girerek SQL veritabanı yolunu kendi veritabanı yolunuz ile güncelleyin.

• Sonrasında bağlantı yolu doğru ise Package Manager Console'dan Migration işlemlerini yaparak veri tabanını oluşturabilirsiniz.

• Veri tabanınız oluştuğunda içinde 3'er adet örnek veri ile beraber oluşmaktadır. Siz bu verileri değiştirebilir yada üzerine ekleyebilirsiniz.


🌟Proje'yi Yıldızlayıp(⭐) bana destekte bulunabilirsiniz..🌟

About

RESTful Web API - .Net Core - Entity Framework Core - N-Tier Architecture - MSSQL - DTO - AutoMapper - Fluent Validation - Middleware - DI Container - Postman – Nlog – UseException Handler – Content Negotiation – Async – Action Filters – Pagination – Filtering – Searcing – Sorting – Data Shaping – Hateoas – Options and Head – Root Documentation –


Languages

Language:C# 100.0%