ASP Genel VMware

ASP.NET Core ile RESTful API Geliştirme Rehberi

ASP.NET Core ile RESTful API Geliştirme Rehberi

ASP.NET Core ile RESTful API Geliştirme Rehberi

ASP.NET Core, Microsoft tarafından geliştirilen ve modern web uygulamaları geliştirmek için kullanılan güçlü bir çerçevedir. RESTful API’ler, uygulamalar arasında veri alışverişi yapmanın standart bir yolu haline gelmiştir. Bu rehberde, ASP.NET Core kullanarak RESTful API geliştirme sürecini adım adım inceleyeceğiz.

1. RESTful API Nedir?

REST (Representational State Transfer), web servisleri için bir mimari tarzdır. RESTful API’ler, HTTP protokolünü kullanarak veri iletimi yapar ve bu iletimi genellikle JSON veya XML formatında gerçekleştirir. RESTful API’lerin temel özellikleri şunlardır:

Stateless (Durumsuzluk): Her API çağrısı bağımsızdır ve önceki çağrılar hakkında bilgi taşımaz.
Cacheable (Önbelleğe Alınabilirlik): Yanıtlar önbelleğe alınabilir.
Client-Server (İstemci-Sunucu Mimarisi): İstemci ve sunucu birbirinden bağımsızdır.
Uniform Interface (Tekdüze Arayüz): Kaynaklar URI’ler aracılığıyla tanımlanır ve standart HTTP metodları (GET, POST, PUT, DELETE) kullanılır.

2. ASP.NET Core ile Proje Oluşturma

ASP.NET Core ile RESTful API geliştirmeye başlamak için ilk adım bir proje oluşturmaktır. Visual Studio veya .NET CLI kullanarak bir ASP.NET Core Web API projesi oluşturabilirsiniz.

Visual Studio Kullanarak Proje Oluşturma

1. Visual Studio’yu açın ve “Create a new project” seçeneğini tıklayın.

  1. “ASP.NET Core Web API” şablonunu seçin ve “Next” butonuna tıklayın.
3. Proje adını ve konumunu belirleyin, ardından “Create” butonuna tıklayın.
  1. Hedef çerçeve olarak “.NET 6.0” veya daha yeni bir sürümü seçin ve “Create” butonuna tıklayın.

.NET CLI Kullanarak Proje Oluşturma

Aşağıdaki komut, .NET CLI kullanarak yeni bir ASP.NET Core Web API projesi oluşturur:

dotnet new webapi -n MyApiProject

Bu komut, “MyApiProject” adında yeni bir Web API projesi oluşturur.

3. Controller ve Route Yapılandırması

ASP.NET Core’da, RESTful API’ler genellikle Controller sınıfları aracılığıyla tanımlanır. Controller’lar, gelen HTTP isteklerini işler ve uygun yanıtları döner.

Controller Oluşturma

Aşağıda, bir “Products” controller örneği bulunmaktadır:

using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;

namespace MyApiProject.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class ProductsController : ControllerBase
    {
        [HttpGet]
        public IEnumerable Get()
        {
            return new string[] { "Product1", "Product2" };
        }

        [HttpGet("{id}")]
        public string Get(int id)
        {
            return $"Product{id}";
        }

        [HttpPost]
        public void Post([FromBody] string value)
        {
        }

        [HttpPut("{id}")]
        public void Put(int id, [FromBody] string value)
        {
        }

        [HttpDelete("{id}")]
        public void Delete(int id)
        {
        }
    }
}

Bu controller, ürünlerle ilgili CRUD (Create, Read, Update, Delete) işlemlerini gerçekleştirmek için gerekli olan temel HTTP metodlarını içerir.

4. Dependency Injection ve Servis Katmanı

ASP.NET Core, Dependency Injection (DI) için yerleşik bir destek sunar. Bu, uygulamanın farklı bölümlerinin birbirine sıkı sıkıya bağlı olmasını önler ve test edilebilirliği artırır.

Servis Katmanı Oluşturma

Öncelikle bir servis arayüzü ve uygulaması oluşturalım:

public interface IProductService
{
    IEnumerable GetAllProducts();
    string GetProductById(int id);
}

public class ProductService : IProductService
{
    public IEnumerable GetAllProducts()
    {
        return new List { "Product1", "Product2", "Product3" };
    }

    public string GetProductById(int id)
    {
        return $"Product{id}";
    }
}

Servislerin Bağımlılık Olarak Eklenmesi

Startup.cs dosyasında, servisleri DI konteynerine ekleyin:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddScoped();
}

Bu, ProductService sınıfının IProductService arayüzü üzerinden enjekte edilebilmesini sağlar.

5. Veritabanı Entegrasyonu

Gerçek dünya uygulamalarında, veriler genellikle bir veritabanında saklanır. ASP.NET Core, Entity Framework Core (EF Core) kullanarak veritabanı işlemlerini kolaylaştırır.

Entity Framework Core Kurulumu

EF Core’u projenize eklemek için, aşağıdaki NuGet paketlerini yükleyin:

dotnet add package Microsoft.EntityFrameworkCore
dotnet add package Microsoft.EntityFrameworkCore.SqlServer

DbContext ve Model Tanımlama

Örnek bir Product modeli ve DbContext sınıfı tanımlayalım:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions options) : base(options) { }

    public DbSet Products { get; set; }
}

Veritabanı Bağlantısı ve Migration

Startup.cs dosyasında, veritabanı bağlantı ayarlarını yapın:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddScoped();
    services.AddControllers();
}

Ardından, veritabanı migration’larını uygulayın:

dotnet ef migrations add InitialCreate
dotnet ef database update

6. Güvenlik ve Yetkilendirme

API güvenliği, RESTful servislerin en önemli bileşenlerinden biridir. ASP.NET Core, güvenlik ve yetkilendirme için bir dizi araç sunar.

JWT (JSON Web Token) ile Kimlik Doğrulama

JWT, kullanıcı kimlik doğrulaması için yaygın olarak kullanılan bir yöntemdir. JWT kullanarak, API’lerinizin güvenliğini artırabilirsiniz.

JWT kimlik doğrulaması için gerekli paketleri yükleyin:

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

Startup.cs dosyasında, JWT ayarlarını yapılandırın:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = true,
                ValidateAudience = true,
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,
                ValidIssuer = Configuration["Jwt:Issuer"],
                ValidAudience = Configuration["Jwt:Audience"],
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
            };
        });

    services.AddDbContext(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddScoped();
    services.AddControllers();
}

Yetkilendirme Attribütleri Kullanma

Controller veya metod seviyesinde yetkilendirme uygulamak için [Authorize] attribütünü kullanabilirsiniz:

[Authorize]
[HttpGet]
public IEnumerable Get()
{
    return new string[] { "Product1", "Product2" };
}

Bu, ilgili metodun yalnızca kimliği doğrulanmış kullanıcılar tarafından erişilebilir olmasını sağlar.

7. Performans Optimizasyonu

API performansını artırmak için bir dizi strateji uygulayabilirsiniz. Bunlar arasında önbellekleme, sıkıştırma ve veri optimizasyonu bulunur.

Response Caching

ASP.NET Core, yanıtların önbelleğe alınmasını sağlayan bir Response Caching middleware sunar. Bu, aynı isteklerin tekrar tekrar işlenmesini önleyerek performansı artırır.

Startup.cs dosyasında, önbellekleme middleware’ini etkinleştirin:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();
    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseResponseCaching();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

Controller üzerinde [ResponseCache] attribütünü kullanarak önbellekleme ayarlarını yapabilirsiniz:

[HttpGet]
[ResponseCache(Duration = 60)]
public IEnumerable Get()
{
    return new string[] { "Product1", "Product2" };
}

Bu, yanıtın 60 saniye boyunca önbelleğe alınmasını sağlar.

8. Hata Yönetimi

Hataların düzgün bir şekilde ele alınması, API’nizin güvenilirliğini artırır. ASP.NET Core, hata yönetimi için bir dizi araç sunar.

Global Hata Yönetimi

Startup.cs dosyasında, global hata yönetimi middleware’ini yapılandırabilirsiniz:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseRouting();
    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

Özel Hata Mesajları

Controller metodlarında özel hata mesajları dönebilirsiniz:

[HttpGet("{id}")]
public IActionResult Get(int id)
{
    try
    {
        var product = _productService.GetProductById(id);
        if (product == null)
        {
            return NotFound(new { Message = "Product not found" });
        }
        return Ok(product);
    }
    catch (Exception ex)
    {
        return StatusCode(500, new { Message = "An error occurred", Details = ex.Message });
    }
}

Bu, API kullanıcılarına daha anlamlı hata mesajları sağlar.

9. Yayınlama ve Barındırma

API’nizi yayınlamak ve barındırmak için çeşitli seçenekler mevcuttur. VDS Sunucular, Cloud Sunucular veya Dedicated Sunucu gibi hizmetler kullanarak API’nizi güvenli ve ölçeklenebilir bir şekilde barındırabilirsiniz.

Yayınlama Adımları

1. Projenizi derleyin ve yayınlayın:

   dotnet publish -c Release
   

2. Yayınlanan dosyaları seçtiğiniz sunucuya yükleyin.

  1. Sunucu yapılandırmalarını yaparak API’nizi erişilebilir hale getirin.

Bu rehberde, ASP.NET Core kullanarak RESTful API geliştirme sürecini kapsamlı bir şekilde ele aldık. ASP.NET Core’un esnek yapısı ve geniş araç seti sayesinde, güçlü ve ölçeklenebilir API’ler geliştirmek mümkündür. Uygulamalarınızı daha da güçlendirmek için uygun sunucu ve barındırma çözümlerini tercih edebilirsiniz.