API Geliştirmede Request&Response Sınıfları
Api geliştirirken apimize gelen istek ve client’a gönderilen yanıt datalarının şekillendirilmesi için kullanılan bir yöntemden bahsedeceğiz.

Bu yöntem proje içerisinde oluşturulan klasik entity sınıfları tipinde bir request almak veya response göndermek yerine, ayrıca oluşturulmuş request ve response sınıfları üzerinden datalarımızı yapılandırmamızı sağlar.
Peki zaten oluşturduğumuz entity sınıflarımız varken neden ayrıca böyle bir yapıya ihtiyaç duyuyoruz?
Örneğin, bir web sitesinden gelen POST isteğinden gönderilen bodyde entity’nin id bilgisine ihtiyacımız olmayabilir (mesela id alanlarının otomatik atandığı durumlarda), fakat api response’unda id bilgisine ihtiyaç duyulabilir. Böyle durumlarda request ve reponse yapılarını ayrı olarak oluşturmamız gerekir.
Daha iyi anlamamız için bir örnek üzerinden inceleyelim.
Aşağıda bir Post entity sınıfını görüyoruz.

Bu projede apiye gelen post oluşturma isteklerinde user olarak belirtilen relational alanı bir obje olarak almak yerine sadece user id alanını almamız yeterli olur. Bu durumda aklımıza yeni bir post request sınıfı oluşturmak geliyor.
Request sınıfımızı oluşturup kullanmadan önceki controller methodumuz aşağıdaki gibi.

Bu şekilde ki bir istekte bodyden gönderilecek olan datanın içinde user bilgisi de bulunuyor olmalı. Çünkü Post sınıfında zaten relational olarak user alanı gerekli. Yani göndermemiz gereken post isteği aşağıdaki gibi:

Burada görüldüğü gibi user alanında tüm user bilgilerini obje notasyonunda geçmemiz gerekir.
Bir de request sınıfımızı oluşturduktan sonraki kullanım şeklimize bakalım.

Klasik post işlemi yaptırdığımız servis methodumuzu düzenlersek:

Ve tabiki ilgili controller sınıfı metodunu da yeni request sınıfımıza göre güncellememiz gerekir.

Artık post isteğinin body kısmından bütün bir user objesini değil sadece user id bilgisini almamız yeterli olacaktır.
Aynı yöntemi diğer gerekli gördüğümüz entity sınıfları içinde oluşturabiliriz.
Request/response yöntemini kullandığım projemi inceleyebileceğiniz github repom: