Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Json Veriyi Record Tipe Deserializede eksik değerlerin Null yapılabilmesi
#1
Arkadaşlar Merhaba;
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 

SynCommons.RecordLoadJSON(entity, RawUTF8(requestData),

     TypeInfo(TCari));

metodu ile Cari recorduna verileri aldığımda bu clientten eksik gelen 2 alan doğal olarak Record tipimde boş string olarak geliyor.

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.

 if  not  (entity.CariTanimi ='') then

      ds.FieldByName('caritanimi').AsString := entity.CariTanimi;

Ancak bu durumda da eğer client gerçekten bu alanın içini boşaltmak isterse yani "CariTanimi":"", şekllinde bir Json Key Value si göndermek isterse bu sefer yukarıdaki kod bu alanın update edilmesini engelleyecektir.

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.
Cevapla
#2
basitçe aşağıdaki gibi isteyebilirsiniz, ben bu şekilde kullanıyorum.

{
 "islem" : 1, // ekle
"tablo": "TCari",
"fields": ["kod", "unvan"],
"values": [1, "XXX firması"]
}

Client veri istediğinde de;

{
"islem" : 4, // veri gonderimi
"tablo": "TCari",
"fields": {
["kod", type, size],
["unvan", type, size],
},
"values": {
[1, "XXX firması"],
[2, "YYY firması"]
}
}

json formatında hatalar olabilir.
WWW
Cevapla
#3
(27-08-2021, Saat: 14:57)LastCoder Adlı Kullanıcıdan Alıntı: Clientteki geliştirici de hangi alanları güncellemek istiyorsa o alanları göndereceği kendi methodlarını oluştursun.

Tam da bu yüzden HTTP protokolünde PATCH methodu var. Bence size gerekli olan PUT değil, PATCH. 
PATCH'i araştırmanızı tavsiye ederim
There's no place like 127.0.0.1
WWW
Cevapla
#4
(28-08-2021, Saat: 00:17)SimaWB Adlı Kullanıcıdan Alıntı:
(27-08-2021, Saat: 14:57)LastCoder Adlı Kullanıcıdan Alıntı: Clientteki geliştirici de hangi alanları güncellemek istiyorsa o alanları göndereceği kendi methodlarını oluştursun.

Tam da bu yüzden HTTP protokolünde PATCH methodu var. Bence size gerekli olan PUT değil, PATCH. 
PATCH'i araştırmanızı tavsiye ederim

Teşekkür ederim.Bu metodu araştıracağım.Mimari açısından daha doğru bir yöntemi önerdiğinizi anladım burdan.
Ancak bir başka arkadaşımızın önerisiyle bu sorunu şu şekilde çözdüm.
Burayada yazayım ki mutlaka birilerine gerekecektir.

Yanlış Kod 1:

if  not  (entity.CariTanimi ='') then

     ds.FieldByName('caritanimi').AsString := entity.CariTanimi;

Yanlış Kod 2:

if  not  (entity.CariTanimi =Null) then

     ds.FieldByName('caritanimi').AsString := entity.CariTanimi;

Doğru Kod 1:

Variant tipler İçin:

 
if  not (entity.CariTanimi=UnAssigned) then

           ds.FieldByName('caritanimi').AsString := entity.CariTanimi;
 

İyi Akşamlar.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  JSON DataSet Serialize for Unidac Halil Han BADEM 2 507 08-11-2023, Saat: 16:53
Son Yorum: Halil Han BADEM
  JSON Verilerini Veritabanına Kaydetmek kajmerantime 6 750 03-11-2023, Saat: 15:05
Son Yorum: kajmerantime
  JSon Format m_ekici 7 948 02-10-2023, Saat: 09:24
Son Yorum: yhackup
  DBGRID yeni sütun ekle veri gir diğer sütundaki veriyi değiştir stevenskat 8 821 08-09-2023, Saat: 22:47
Son Yorum: m_ekici
  WebBrowser1 Gelen Veriyi Pdf e Çevirme sadoal351 6 1.184 26-07-2023, Saat: 18:38
Son Yorum: nguzeller



Konuyu Okuyanlar: 1 Ziyaretçi