2012-04-10 14 views
12

Bir REST API'si tasarlıyorum ve nesne grafiklerini güncellemek için önerilen en iyi uygulamayı arıyorum. Sorum iyi bir örnek olarak açıklanmıştır, bu yüzden aşağıdaki gibi bir GET kaynak olduğunu varsayalım edilir:REST API Nesne Grafiğini Güncellemek için Tasarım

URI:/insanlar/Bu URI böyle bir nesne grafiği döndüren 123

:

{ 
    "name":"Johnny", 
    "country":{"id":100,"name":"Canada"}, 
    "likes":[ 
     {"id":5,"name":"Fruit"}, 
     {"id":100,"name":"Sports"} 
    ] 
} 

API tüketicisinin bu kaynağı güncellemesine izin verirken, nesnenin PUT veya PATCH yoluyla güncellenmesini nasıl beklersiniz? "İsim" özelliğini güncellemek oldukça basittir, ancak tüketici yalnızca diğer nesnelerle olan ilişkiyi değiştirip yenilerini yaratamayacağı için "ülke" veya "beğenme" konusunda emin değilim.

{ 
    "name":"Bob", 
    "countryId":200 
    "likeIds":[3,10,22] 
} 

Bu güncelleme aşağıdaki kaynağın değişecektir:

{ 
    "name":"Bob", 
    "country":{"id":200,"name":"United States of America"}, 
    "likes":[ 
     {"id":3,"name":"Cars"}, 
     {"id":10,"name":"Planes"}, 
     {"id":22,"name":"Real Estate"} 
    ] 
} 

Bu tasarım açıkça ve net bir şekilde sadece "güncellemek için tüketici sorar İşte

güncelleme isteğinde bir yoludur "Kişinin" kimlikleri, ancak bir PUT/PATCH için nesne grafiğinin GET'ten farklı olduğunu ve API'nın öğrenmesi ve hatırlaması zor olmasını endişeliyim. Yani başka bir seçenek aşağıdaki gibi PUT/PATCH'i istemek için geçerli:
{ 
    "name":"Bob", 
    "country":{"id":100}, 
    "likes":[ 
     {"id":3}, 
     {"id":10}, 
     {"id":22} 
    ] 
} 

Bu

önceki güncelleştirmeyi aynı değişiklik meydana getirecektir ve nesne grafiği değiştirmez. Bununla birlikte, API tüketicisine yalnızca "Kimlikler" in güncellenebileceğini açıkça belirtmemektedir.

Bu senaryoda, hangi yaklaşım önerilir?

cevap

8

Bence hem GET hem de PUT talepleri için aynı yapıyla kalmalısınız. Niye ya? JSON/XML verilerini nesneler ile eşleştirmek oldukça yaygındır ve JSON şeması her zaman aynıysa gerçek haritalama işini en çok yapan yazılım (çoğu olmasa da) en iyisidir. It does not have Ancak

{ 
    "name":"Joe", 
    "country":{"id":200,"name":"United States of America"}, 
    "likes":[ 
     {"id":5,"name":"Fruit"} 
    ] 
} 

dikkate ülke adı ve tek ülke id may odağı almaya:

Yani webservice bir aşağıdaki JSON kodu kabul etmelidir.

+1

Bu bakış açısını tam olarak destekliyorum. –

+0

Teşekkürler Crozin ve Ferenc. –