ASPNET .NetCore Api Response NamingStrategy Belirlenmesi
Öncelikle Naming Conventions konusuna kısaca değinmek istiyorum. Glabol düzeyde farklı insanların aynı veya birbirine yakın işleri yaptığı her platform için çeşitli standartlar belirlenmiştir. Yazılım dünyasında da kod standartları oldukça önemlidir, Microsoft teknolojileriyle yazılım geliştiriyorsanız ilk olarak Microsoft naming conventions makalesini incelemenizde fayda var.
Bu makalemizde API üzerinden response çıktılara global düzeyde müdahale edip çeşitli standartları veya kendi standartlarımızı uygulamayı örnekleyeceğiz.
Neye ihtiyacımız var ?
ASPNET .NetCore 3.0 üzerinden çalışan JSON API
Senaryo
Öğrenci bilgilerinin API response alınması ve kontrol edilmesi
Model ;
1 2 3 4 5 6 7 8 9 10 11 12 |
public class Student { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public DateTime BirthDate { get; set; } public string ClassRoom { get; set; } } |
Başlayalım..
Öncelikle Startup.cs içerisinde bazı Configuration ayarlarını yapmamız gerekiyor. Aslında bahsettiğim configuration bir ContractResolver belirlenmesi. JSON Serialize işleminde kullanılacak resolver’ı API tanıtalım.
.Net Core 3.0 öncesinde SerializerSettings için AddJsonOptions
kullanılırken NetCore 3.0 ile birlikte AddNewtonsoftJson
methodunu kullanmamız gerekecek.
( Where did AddJsonOptions go in .NetCore 3.0 )
Nuget üzerinden Microsoft.AspNetCore.Mvc.NewtonsoftJson paketini yükleyelim veya .csproj dosyası içersinde aşağıdaki kodu eklememiz yeterli olacaktır.
1 2 3 4 5 6 7 |
<ItemGroup> <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.0.0" /> </ItemGroup> |
Startup.cs içersinde ConfigureServices methodunda JsonNet.Serialization lardan CamelCase’i set ediyoruz. Defult olarak tanımlı NamingStrategy sınıflarına Newtonsoft.Json.Serialization altından erişebilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public void ConfigureServices(IServiceCollection services) { services.AddControllers() .AddNewtonsoftJson(option => option.SerializerSettings.ContractResolver = new DefaultContractResolver { NamingStrategy = new CamelCaseNamingStrategy() }); } |
Response üzerinde property isimlerninin camelCase kullanıldığını görebilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
[ { "id":1, "firstName":"Ali", "lastName":"Nazik", "birthDate":"1990-05-15T00:00:00", "classRoom":"Teknik1" }, { "id":1, "firstName":"Veli", "lastName":"Gümüş", "birthDate":"1989-05-01T00:00:00", "classRoom":"Teknik2" }, { "id":1, "firstName":"Mehmet", "lastName":"Bakır", "birthDate":"2000-08-25T00:00:00", "classRoom":"Teknik3" } ] |
Custom NamingStrategy
Bazı durumlarda isimlendirme standartlarını kendiniz belirlemek istersiniz veya stabil bir standartlara zorlanabiliriz. Bu tarz durumlar için bazı özelleştirmeler yapılmalı.
Örneklendirme için _{PropName}_ şeklinde bir standartlandırmaya zorlandığımızı düşünelim.
Standart isimlendirme sınıflarını kontrol ettiğimizde (örn. CamelCaseNamingStrategy) NamingStrategy abstract sınıfı base aldığını görüyoruz. Abstract methodunu override edip base methodu eziyoruz
1 2 3 4 5 6 7 8 9 10 11 |
public class MyCustomNameStrategy : NamingStrategy { protected override string ResolvePropertyName(string name) { return $"_{name}_"; } } |
Son olarak Startup.cs içerisindeki ConfigurationSerrvices methodumuzda set edilen ContractResolver’ın NamingStrategy özelliğini set edelim.
1 2 3 4 5 |
NamingStrategy = new MyCustomNameStrategy() |
Output
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
[ { "_Id_":1, "_FirstName_":"Ali", "_LastName_":"Nazik", "_BirthDate_":"1990-05-15T00:00:00", "_ClassRoom_":"Teknik1" }, { "_Id_":1, "_FirstName_":"Veli", "_LastName_":"Gümüş", "_BirthDate_":"1989-05-01T00:00:00", "_ClassRoom_":"Teknik2" }, { "_Id_":1, "_FirstName_":"Mehmet", "_LastName_":"Bakır", "_BirthDate_":"2000-08-25T00:00:00", "_ClassRoom_":"Teknik3" } ] |