Altbilgi içeriğine atla
Iron Academy Logo
C# öğrenin
C# öğrenin

Diğer Kategoriler

Minimal API'larda .NET 10'da Veri Doğrulama

[[academy-video-youtube({"vid": "sW_AcN-nD0Y", "start_time": "0", "title": ".NET 10 Minimal API'lerde Veri Doğrulama", "creator": "Tim Corey", "length": "~10m"})]]

Minimal API'ler her zaman ASP.NET Core tabanlı denetleyiciye alternatif olarak incelikli olmuştur, ancak uzun süre eksiklikleri vardı: Gelen verilerin doğruluğunu sağlamak için yerleşik destek yoktu. Ya her işleyicide manuel kontroller kurardınız ya da üçüncü taraf kütüphanelerine güveniriz. .NET 10, sorgu zincirleri, başlıklar ve istek gövdeleri için birinci sınıf veri açıklama doğrulama ile bu açığı kapatır, ekstra paket olmadan.

Tim Corey's rehber öğretiminden esinlenilerek hazırlanan bu .NET 10 Minimal API'leri üzerine derin dalış, doğrulama hizmetini nasıl kaydedileceğini, model sınıflarına nasıl açıklama ekleyeceğinizi ve yapınıza zarar verecek zamanda nasıl sıkça erişim değiştirici tuzaklarına düşmeyeceğinizi açıklar.

Kurulum: Basit bir Minimal API

[0:44 - 1:35] Demo, üzerinde .NET 10 çalıştıran bare-bones bir ASP.NET Core Minimal API projesi ile başlar. Yüzey kasıtlı olarak küçüktür: her biri farklı bir model kabul eden iki POST uç noktası.

app.MapPost("/person", (Person person) => Results.Ok(person));
app.MapPost("/login", (LoginModel login) => Results.Ok(login));
app.MapPost("/person", (Person person) => Results.Ok(person));
app.MapPost("/login", (LoginModel login) => Results.Ok(login));

Model Person temel kimlik alanlarını taşır. LoginModel kimlik bilgilerini yönetir: bir e-posta adresi, bir parola ve bir parola onay alanı. Her ikisi de JSON gövdeleri olarak gönderilir. Bu noktada hiçbir giriş kontrolü yoktur; API, aldığını kabul eder, boş dizeler ve hatalı biçimlendirilmiş e-posta adresleri dahil.

Scalar (modern OpenAPI UI ile birlikte gelen .NET 10), doğrudan tarayıcıdan test istekleri göndermek için kullanılır, böylece doğrulama kurulduktan önce ve sonra API'nin ne döndüğünü tam olarak görmek kolaydır.

Doğrulama Hizmetinin Kaydedilmesi

[2:36 - 3:06] Herhangi bir doğrulama özelliği etkili olmadan önce, hizmet seviyesinde devreye girmeniz gerekir. Hizmet kaydınızda tek bir çağrı, tüm Minimal API uç noktalarında zorlamayı etkinleştirir:

builder.Services.AddValidation();
builder.Services.AddValidation();

Bu tek satır, tüm yapılandırma adımıdır. Eklenecek hiçbir ara katman yok, bağlanacak hiçbir boru hattı aşaması yok. Hizmet kaydedildikten sonra, çerçeve otomatik olarak devralır. Bu çağrıyı atlarsanız, veri açıklama özellikleriniz model üzerinde bulunacak ancak asla değerlendirilmeyecek ve istekler içerdiklerine bakılmaksızın geçer.

Bu, ilk hata ayıklama adımı olarak akılda tutulmaya değerdir: doğrulama sessizce hiçbir şey yapmıyorsa, genellikle eksik parça AddValidation()'tır.

Bir Sınıf Modeline Doğrulama Ekleme

[3:00 - 3:55] Hizmet kaydedildiğinde, sınıf tabanlı bir modele doğrulama eklemek, özellikleri veri açıklama özellikleri ile süslemekten ibarettir:

public class Person
{
    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }
}
public class Person
{
    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }
}

Dosyanın en üstüne System.ComponentModel.DataAnnotations kullanma yönergesi eklendikten sonra, FirstName ve LastName[Required] olarak işaretlemek bunların doğrulanmasını sağlar. Scalar aracılığıyla boş bir gövde ile bir POST isteği gönderildiğinde, artık yapısal bir hata yanıtı ile 400 Bad Request geri döner:

{
  "errors": {
    "FirstName": ["The FirstName field is required."],
    "LastName": ["The LastName field is required."]
  }
}

Hiçbir özel hata işleme, hiçbir filtre özellikleri gerekmez. Çerçeve bu yanıtı otomatik olarak üretir ve kontrol, işleyici gövde çalışmadan önce gerçekleştirilir, böylece uç nokta mantığında boş girişleri koruma ihtiyacınız asla kalmaz.

Bir Kayıt İçin Doğrulama Uygulama

[4:29 - 5:30] Aynı özellikler C# kayıtları üzerinde çalışır, ancak sözdizimi biraz farklıdır çünkü kayıt özellikleri genellikle birincil yapıcıda tanımlanır, ayrı üye bildirimleri değil.

public record LoginModel(
    [Required] [EmailAddress] string Email,
    [Required] string Password,
    [Required] string ConfirmPassword
);
public record LoginModel(
    [Required] [EmailAddress] string Email,
    [Required] string Password,
    [Required] string ConfirmPassword
);

Yapıcı parametrelerindeki nitelikler, üretilen özelliklere uygulanır, bu nedenle [Required] ve [EmailAddress] bir sınıfta oldukları gibi davranır. Örneğin, "notanemail" gibi hatalı yapılandırılmış bir e-posta ile bir istek göndermek, artık 400'i döndürür ve Email alanını geçersiz olarak tanımlar.

[Compare] niteliği, ConfirmPassword'un Password ile eşleşmesini sağlamak için de kullanılabilir. Bir kayıtta, özellik hedefleri, derleyicinin oluşturulan üyeyi değil yapıcı parametreyi kastettiğinizi bilmesi gerektiğinden dolayı açık bir dürtüye ihtiyaç duyar:

[property: Compare(nameof(Password))]
string ConfirmPassword
[property: Compare(nameof(Password))]
string ConfirmPassword

[property:] hedefi, derleyiciye niteliği parametre yerine üretilen üyeye eklemesini söyler. Bunu olmadan, [Compare] derlenir ancak kontrol sırasında asla çalışmaz. kayıt ve sınıf karşılaştırması bağlamında çalışmanın en karmaşık kısmı budur: sınıf özellikleri doğal olarak özellikleri kabul ederken, kayıt parametreleri üye seviyesinde çalışan her şey için açık hedefe ihtiyaç duyar.

Genel Erişim Değiştiricisi Gereksinimi

[7:51 - 9:00] Ortak bir tuzak fark edilmesi kolaydır ve karşılaşıldığında hata mesajı üretmez. Doğrulama sistemi, çalışma zamanında model türlerinizi incelemek için yansıma kullanır; bir türün üyelerinin yansıma tarafından bulunabilmesi için, türün kendisinin public olarak işaretlenmesi gerekir.

// Validation will NOT run; the class is internal by default
class Person { ... }

// Validation runs correctly
public class Person { ... }
// Validation will NOT run; the class is internal by default
class Person { ... }

// Validation runs correctly
public class Person { ... }

Aynı kural kayıtlara da uygulanır. Modeliniz bir erişim belirteci olmadan bildirildiyse, C# varsayılan olarak internal kullanır ve hizmet tamamen atlar. Uç noktalar hala isteği alır, işleyici hala çalışır ve hata döndürülmez; kontroller sessizce hiçbir şey yapmaz.

Bu, Minimal API'lere özgü olmayan bir ASP.NET Core davranışıdır, ancak bu projeler genellikle kompakt olduğundan ve geliştiriciler bazen modelleri görünürlüğü düşünmeden satır içi veya Program.cs ile aynı dosyada tanımladıklarından burada daha sık ortaya çıkar.

Projenizi denetlemenin hızlı bir yolu: bir uç noktası işleyicisine geçirilen herhangi bir model türü açıkça public olarak işaretlenmelidir. Eğer değilse, hiçbir sayıda özellik çerçevenin çalışmasını sağlayamaz.

Doğrulayabileceğiniz Şeyler

Yerleşik veri açıklama özellikleri, herhangi bir ek çalışma olmaksızın en yaygın senaryoları kapsar:

  • [Required] null veya boş değerleri reddeder
  • [EmailAddress] bir e-posta dizesinin biçimini doğrular
  • [Compare] iki özelliğin eşleştiğini kontrol eder, parola onayı için kullanışlıdır
  • [Range] sayısal veya tarih sınırlarını zorlar
  • [StringLength] isteğe bağlı bir minimum ile dize uzunluğunu sınırlar
  • [RegularExpression] özel bir desene karşı doğrulama yapar

Bunların tümü, sorgu dizesi parametrelerinde, istek başlıklarında ve JSON gövdelerinde çalışır. Aynı model sınıfı veya kaydı, herhangi bir özellik değiştirmeden farklı kaynaklardan bağlanabilir.

Sonuç

[7:46 - end] AddValidation() kayıtlı ve modelleriniz dekore edilmiş şekilde, Minimal API'ler giriş kısıtlamalarını otomatik olarak hem sınıflar hem de kayıtlar genelinde uygular. .NET 10'da bunu çalışır hale getirmek için, sadece builder.Services.AddValidation() bir kez çağırın, model özelliklerinizi standart veri açıklama nitelikleri ile süsleyin ve her model türünün public olarak işaretlendiğinden emin olun.

[property:] kayıtlarda hedefine ve public belirteci gereksinimi gerçek sürprizlerdir. Yöneleri göz ardı etmek kolaydır ve sessiz başarısızlıklara neden olur, bu yüzden bunları listeye ekleyin, giriş denetimleri hiçbir şey yapmadığında.

Tam kaynak kod yürüyüşü için Tim Corey's YouTube kanalında tam videoyu izleyin.

Hero Worlddot related to Minimal API'larda .NET 10'da Veri Doğrulama
Hero Affiliate related to Minimal API'larda .NET 10'da Veri Doğrulama

Sevdiğiniz Şeyleri Paylaşarak Daha Fazla Kazanın

.NET, C#, Java, Python veya Node.js ile çalışan geliştiriciler için içerik oluşturuyor musunuz? Uzmanlığınızı ek gelire dönüştürün!

Iron Destek Ekibi

Haftada 5 gün, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara