1. main: mvc katmanı olmayan sadece api katmanlı versiyon
2. AspNETAPI-MVC: MVC Katmanının API katmanı ile entegre olduğu versiyon.
3. AspNETMVC: API katmanı olmadan MVC katmanın Service katmanıyla haberleştiği versiyon.
En yaygın kullanılan metotlar.
- GET: Data okuma için kullandığımız tiptir
- POST: Yeni bir nesne eklediğimizde kullandığımız tiptir.
- PUT: Bir nesne üzerinde güncelleme yapılacaksa kullandığımız tiptir.
- DELETE: Bir nesne silmek için kullandığımız tiptir.
Method | Doğru | Yanlış |
---|---|---|
GET | https://localhost:7264/api/products | https://localhost:7264/api/getproducts |
GET | https://localhost:7264/api/products/3 | https://localhost:7264/api/getproductnyid/10 |
POST | https://localhost:7264/api/products | https://localhost:7264/api/saveproduct |
PUT | https://localhost:7264/api/products | https://localhost:7264/api/updateproduct |
DELETE | https://localhost:7264/api/products | https://localhost:7264/api/deleteproduct |
- 100 - Information Responses : 100 ile başlıyan cevaplar bilgilendirici cevaplardır.
- 200 - Successful Responses: 200 ile başlıyan kodlar yapılan isteğin başarılı olduğunu gösterir.
- 300 - Redirect Messages: 300 ile başlıyanlar yönlendirme mesajlarını gösterir.
- 400 - Client Error Responses: Client isteği hatalıysa 400 lü kodlar kullanılır.
- 500 - Server Error Responses: Sunucumuzda bir hata oluştuğunda kullanılan hata kodlarıdır.
En Çok Kullanılan Durum Kodları:
- 200 - Ok: Başarılı istek karşılığında geri dönülecek durum kodudur. Get metodu karşılığı dönülebilir. Get metotlarında kullanılabilir.
- 201 - Created: Yeni bir nesne eklendiğinde geri dönen durum kodudur. Post metotlarında kullanılabilir.
- 204 - NoContent: Eğer güncelleme veya silme işlemi varsa, yani PUT ve Delete metotlarının sonucunu dönmek için kullanılır.
- 400 - BadRequest: Client tarafında hatalı bir istek yaptığında dönülecek durum kodudur. Örneğin gönderilen data format hatası karşılığında dönülecek durum kodudur. Response da da hata ile ilgili açıklamayı dönebiliriz.
- 401 - Unauthorized : Client tarafında süresi bitmiş token gönderilmişse yada gönderilmemişse gibi durumlarda geri dönülen durum kodudur.
- 403 - Forbid: Client tarafından gönderilen tokenın ilgili işleme yetkisi yoktsa geri dönülen durum kodudur.
- 500 - InternalServerError: Suncuu tarafımızda oluşan hatalar için örneğin database bağlanma sorunu vs. gibi hatalarda geri dönülecek durum kodudur.
- Get : https://localhost:7264/categories/3/products -- Doğru
- Get : https://localhost:7264/categories/3/products/5 --Hatalı parent-child ilişkilerinde bu şekilde yapılır olmamalıdır.
- Get: https://localhost:7264/products/3 -- Doğru
GET: https://localhost:7264/api/products/5
[HttpPut("{id}")]
Public IActionResult Update(Product product, int id)
{
// Güncelleme İşlemleri
}
Buradaki gibi hem url den Id alıp, hemde Product nesnesinin içinde Id alınıyor. Bir parametreyi iki kere almış olunuyor. Bunun yerine alttaki yöntemle yazılabilir. GET: https://localhost:7264/api/products
[HttpPut]
Public IActionResult Update(Product product)
{
//Güncelleme İşlemleri
}
public void ConfigureServices(IServiceCollection services)
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
Program.cs dosyamızdaki en önemli 2 metot olan ConfigureServices ve Configure mümkün olduğunca sade tutmak gerekir. Middleware ve Servicelerimizi birer Extension metot içerisine taşıyıp sadece metodu ilgili yerde çağırarak daha sade bir program.cs dosyası yapılandırmış olur.
N Katmanlı mimari ile projeyi inşa etmek proje bazında parçalara bölmemizi sağlar. Yapacağımız uygulama küçük bir pojeyse ilerde büyüme olmayacaksa katmanlı mimari kullanmaya gerek yoktur. Örneğin ; MyApp.Web** => Web Uygulaması MyApp.API => API uygulaması MyApp.Core => ClassLibrary (Temel nesnelerimiz tutarız. ) MyApp.Data => ClassLibrary (Entity Framework işlmelerini içerir) MyApp.Service => ClassLibrary (Data katmanından gelen verileri api a ulaştırmak için) MyApp. Logging => ClassLibrary (Loglama ile ilgili işlemleri gerçekleştirdiğimiz katman)
Controllerda yardımcı metotlar olmamalı. Sadece Action metotlar olmalı .
[Route("api/[controller]")]
[ApiController]
public class ProductsController : ControllerBase
{
private readonly IProductService _productService;
private readonly IMapper _mapper;
public ProductsController(IProductService productService, IMapper mapper)
{
_productService = productService;
_mapper = mapper;
}
[HttpGet]
public async Task<IActionResult> GetAllProduct()
{
var products = await _productService.GetAll();
return Ok(_mapper.Map<IEnumerable<ProductDto>>(products))
}
[ValidationFilter]
[ServiceFilter(typeof(NotFoundFilter))]
[HttpGet("{id}")]
public async Task<IActionResult> GetProductById(int id)
{
var product = await _productService.GetById(id);
return Ok(_mapper.Map<ProductDto>(product));
}
}
[HttpGet]
public async Task<IActionResult> GetAllProduct()
{
var products = await _productService.GetAll();
return Ok(_mapper.Map<IEnumerable<ProductDto>>(products))
}
[ServiceFilter(typeof(NotFoundFilter))]
[HttpGet("{id}")]
public async Task<IActionResult> GetProductById(int id)
{
///İşlemler
}
[ValidationFilter]
[HttpPost]
public async Task<IActionResult> Create(ProductDto product)
{
//İşlemler
}
[ValidationFilter]
[HttpPost]
public async Task<IActionResult> Update(ProductDto product)
{
//İşlemler
}
[ServiceFilter(typeof(NotFoundFilter))]
NotFoundFilter ile id üzerinde veritabanında bu id li product varmı kontrolünü sağlar.
[ValidationFilter]
ValidationFilter ile clienttan gelen ProductDto modelinde hatalı veri varsa bunun kontrolünü yapmak için.
İlgili modellerin DTO(Data Transfer Object) sınıflarını dönün. Yani direk modeli dönmek yerine sadece clientın ihtiyacına özel bir dto dönmeliyiz. Modelimiz:
Public class Product {
public int Id {get; set;}
public string name {get; set;}
public decimal Price {get; set;}
public int Stock {get; set;}
public int CategoryId {get; set;}
public bool IsDeleted {get; set;}
public string InnerBarkod {get; set;}
}
Clienta Dönülecek DTO :
Public class ProductDto {
public int Id {get; set;}
public string name {get; set;}
public decimal Price {get; set;}
public int Stock {get; set;}
public int CategoryId {get; set;}
}
- Core Katmanı : Model(Entity), DTOs, Repository Interfaces, Service Interfaces, UnitOfWork Interfaces
- Repository Katmanı: Migrations, Seeds, Repository Impl, UnitOfWork Impl ⇒ Reference Core Layer
- Service Katmanı: Mapping, Service Impl, Validations, Exceptions ⇒ Reference Repository Layer
- API : Reference Service Layer
- WEB : Reference Service Layer Or Use API
Separation of concern (SoC) (İlgili kod ilgili yerde bulunacak) prensibine uygun AspNetAPI-MVC proje yapısı.