Delphi Web Broker implementasyonu ile bir Rest Api geliştiriyorum.
Server tarafında tablo alanlarını Record olarak tutuyorum.Clientten gelen Json veriyide SynCommon (morMot) kütüphanesi ile bu recordlara atıyorum.
Ve recorda ulaştıktan sonra ise bu recordu UniQuery(Unidac) bileşeni ile veritabanına yazdırıyorum.
Aslında burda bir sorun yok.
Sorun sadeece Put(Update) yönteminde bir küçük açmazım var.
Açıklamaya çalışayım.
Diyelim ki Cari tablomda 20 adet alanım var.
Doğal olarak ta CariRecord tipimde de 20 Adet property var.
Olabilecek tüm hata senaryolarını v.s. server tarafında elimine etmek, front-end geliştiricisine pek hata yapma fırsatı vermek istemiyorum.
Diyelimki Front-End geliştiricisi Put metoduna Json veriyi gönderdi.
Ama Json veri içinde 20 Adet field Key ve Value yerine 18 adet gönderdi.
Bu durumda serverde
Kod: Tümünü seç
SynCommons.RecordLoadJSON(entity, RawUTF8(requestData),
TypeInfo(TCari));
Ve ben update yaparsam ise aslında clientin göndermediği bu iki alana ait veri de değiştirilerek emptystring olarak update edilecek.
Şimdi diyebilirsiniz ki:
1-Clientten gelen Json verinin field sayısını kontrol et.Eğer recordun field sayısına eşit değil ise cliente hata mesajı dön.
Bunu yapmak istemiyorum.Şu yüzden client tarafında ki geliştirici de esnek ve özgür kalsın istiyorum.
Yada şöyle diyelim.Her operasyon için server tarafında ayrı ayrı metodlara boğulmaktansa tek bir metodla işi bitireyim.
Clientteki geliştirici de hangi alanları güncellemek istiyorsa o alanları göndereceği kendi methodlarını oluştursun.
Yada ne bileyim işte önce diyelim serverdekş metodda 20 alanın 15 ini güncellemeye açtıysak eğer yarın öbür gün 16. alanında client tarafında güncellenmesi gerektiği zaman
server tarafında sırf bu alan için extra bir kod değişikliğine ve dolayısıyla server güncellemesine ihtiyaç duymayalım.
Yada sadece bir Cari tablsu için birden fazla Put metodu yazmayalım.Bu örnek belki cari tablus için biraz mantıksız görünebilir ancak karmaşık processlerde kesinlikle buna ihtiyacım olacak.
2.Şöyle bir yapı kur diyebilirsiniz.
Kod: Tümünü seç
if not (entity.CariTanimi ='') then
ds.FieldByName('caritanimi').AsString := entity.CariTanimi;
Aslında sonuç olarak yapmak istediğim olay şu.
Örnek ile açıklayayım.
Clientten gelen JSON verisinde diyelimki Cari tablosuna ait veriler var.
Ve bu Json verisinde 15 adet Key Value çifti var.
Ama benim Cari recordumda ise 20 adet Property var.
İşte burada Json veryi Deserialize ettiğimde ,
ben bu Jsonda gönderilmemiş olan 5 adet propertynin hangileri olduğunu bilebilmeliyim ki,
serverdeki Update metodunda bu 5 alana dokunmayayım.
Onlar üzerinde güncelleme yapmayayayım.
Belki Server tarafındaki Tabloları Record üzerinde değilde , Classlar üzerinde tutsam.(c# Entity Framework mantığında olduğu gibi) o zaman bu Cari nesnesine bu alan Null
olarak gelicek ve ben bu null durumundan bunu anlayabileceğim.
Veya bu null olma durumu Record tipte de olsa gene olucak.
Ancak ben bu deserialize işleminde bu eksik alanları Null yapabilme olayını başaramadım.
Biraz uzun oldu ama kusura bakmayın.
Siz olsanız nasıl bir çözüm bulurdunuz bu soruna.
Ne gibi bir yol önerirsiniz.
Yardım edecek arkadaşlara şimdiden çok teşekkür ederim.