Dinlendirici POST yanıtı için 'En İyi' uygulama


217

Yani burada yeni bir şey yok, sadece biraz açıklama almaya çalışıyorum ve diğer yazılarda bulamıyorum.

Ben yeni bir kaynak restulfully oluşturuyorum, demek:

/books (POST)

bir vücut ile:

{
  title: 'The Lion, the Witch and the Wardrobe',
  author: 'C. S. Lewis'
}

Yeni kaynağın bir Konum başlığı ile 201 (Oluşturuldu) dönmek gerektiğini biliyorum:

Location: /books/12345

Kendime cevap veremediğim soru, sunucunun vücuda ne dönmesi gerektiğidir.

Sık sık bu tür bir yanıt yaptık:

{
  id: 12345,
  title: 'The Lion, the Witch and the Wardrobe',
  author: 'C. S. Lewis'
}

Bunu birkaç nedenden dolayı yaptım:

  1. Angularjs gibi ön uç çerçeveler için API yazdım. Benim özel durumumda açısal kaynakları kullanıyorum ve genellikle kaynağın onu bulması için sadece kimliğe ihtiyacım var. Yanıt gövdesinde kimliği döndürmediysem, Konum başlığından ayrıştırmam gerekirdi.
  2. Tüm kitapların GET'inde genellikle sadece kimliği değil, tüm nesneyi döndürürüm. Bu anlamda, müşteri kodumun kimliğin nereden alınacağını ayırt etmesi gerekmez (konum üstbilgisi veya gövde).

Şimdi buradaki gri alanda olduğumu biliyorum, ama çoğu insan kaynağın tamamını geri vermenin 'kötü' bir uygulama olduğunu söylüyor. Peki ya sunucu değişiyorsa / kaynağa bilgi eklerse. Kesinlikle kimliği ekler, ancak zaman damgası gibi başka şeyler de ekleyebilir. Tüm kaynağı geri vermemem durumunda, bir POST yapmak, kimliği döndürmek, daha sonra istemcinin yeni kaynağı almak için bir GET gerçekleştirmesini gerçekten daha iyi mi?


Ben şahsen POST yanıtları için boş beden tercih ediyorum. RESTful Location üstbilgi değeri bir URI (benzersiz kaynak tanımlayıcısı) olmamalı mı? Bu yüzden belki bir kimlik olarak kullanmalı ve bir sunucu dahili kimliği bulmak için ayrıştırmamalısınız. IMO, RESTful API tüketicileri, belirli bir sunucunun kaynakları nerede bulduğunu tahmin ederek sağlanan köprüleri kullanarak gezinmeli ve yol oluşturmamalıdır ... Ve sonuçta, istemci henüz oluşturduğu kaynağın durumunu bilmiyor mu? tekrarlanması ağ kaynaklarının israfına yol açar.
ch4mp

1
Oluştur / Ekle, Durum 201 - OLUŞTURMA, Başlık Konumu → localhost: 8080 / çalışan / 1 (Bkz: burada )
Hassan Tareq

Yanıtlar:


129

Tüm nesneyi bir güncellemede döndürmek çok alakalı görünmüyor, ancak oluşturulduğunda tüm nesnenin neden geri döndürülmesinin normal kullanım durumunda kötü bir uygulama olduğunu pek anlayamıyorum. Bu, en azından kimliği kolayca almak ve alakalı olduğunda zaman damgalarını almak için yararlı olacaktır. Bu aslında Rails ile iskele alırken var olan varsayılan davranıştır.

İlk POST'unuzla elde edebileceğiniz verileri elde etmek için yalnızca kimliği döndürmenin ve daha sonra bir GET isteği yapmanın hiçbir avantajını görmüyorum.

Her neyse, API'niz tutarlı olduğu sürece, ihtiyaçlarınıza en uygun deseni seçmeniz gerektiğini düşünüyorum. Nasıl bir REST API, imo oluşturmak için doğru bir yolu yoktur.


26
Bu eski olduğunu biliyorum, ama POST sonra bir GET kullanmak için ikna edici bir argüman verebilirim. Http / 1.1 spesifikasyonunda herhangi bir geçmiş araç, GET yanıtınızdan geri gönderilen önbellek ayarlarını yok sayabilir ... bu nedenle, kullanıcınız POST ile güncelledikten sonra bu sayfaya dönmek için tarayıcıdaki geri düğmesini kullanırsa eski orijinal GET'ten önbelleğe alınan veriler. GET'i yeniden kullanırsanız önbelleği güncelleyebilir ve sayfanın ayrıldıklarında nasıl göründüğünün daha iyi bir görüntüsünü alabilirsiniz ...
gölgeli

8
@Shaded API, uygulamalar tarafından da kullanılmak üzere tasarlanmışsa, iki istek yapma argümanınız geçerli değildir. Burada, genellikle model türü nesnelerin bellekte tutulmasıyla verileri önbelleğe alırsınız - bu genellikle POST isteklerinin yanıtıyla yapılır. Tarayıcılarla ilgili olarak, bir GET api uç noktası olduğu sürece bir POST isteğine verilen yanıt gerçekten acı vermez.
Ocak 17'de Jeehut

Daniel'in burada söylediklerine abone oluyorum. Spring Data gibi olgun çerçeveleri kontrol etseniz bile, devam ettikten sonra tüm nesneyi döndürürler. Bence iyi bir uygulamadır, çünkü müşterinizde aynı bilgileri almak için bir sunucu gidiş
dönüşü kaydedeceksiniz

205

Yeni nesnenin döndürülmesi, "Tekdüze Arayüz - Kaynakların temsiller yoluyla manipülasyonu" REST prensibine uygundur. Nesnenin tamamı, yaratılan nesnenin yeni durumunun temsilidir.

API tasarımı için gerçekten mükemmel bir referans var, burada: Pragmatik RESTful API Tasarlamak için En İyi Uygulamalar

Burada sorunuzun yanıtını içerir: Güncellemeler ve oluşturma işlemleri bir kaynak temsili döndürmelidir

Diyor ki:

Bir API tüketicisinin güncellenmiş bir gösterim için API'ya tekrar vurmasını önlemek için, API'nın yanıtın bir parçası olarak güncellenmiş (veya oluşturulan) temsili döndürmesini sağlayın.

Bana çok pragmatik geliyor ve yukarıda bahsettiğim REST prensibine uyuyor.


6
ilgili nesnelerin tamamını döndürmeye ne dersiniz? bu şekilde, olası sıralama sunucu tarafında yapılabilir ve ön uç uygulamasını kolaylaştırır
phil294

2
Ancak bu en iyi uygulamalar en iyisi değildir. Yazar, diğer ilkelerle aynı derecede önemli olan HATEOAS'ın "hazır olmadığı için" kullanılmaması gerektiğine inanıyor. HATEOAS asla "hazır" olmayacaktır, çünkü tüm RESTful ilkeleri sadece mimari tasarım ilkeleridir, özel uygulama değildir. Alıntılanan referans, yazarın HATEOAS'ı bıraktığı için RESTful olmayan RESTful API hakkındaki vizyonu ile ilgilidir. Bu yüzden bu en iyi referans değil :)
marcinn

1
@marcinn - orijinal sorunun 'En İyi' etrafında alıntılar olduğunu not edeceksiniz, sanırım çünkü bu alanda çok fazla görüş var. İşaret ettiğim referans, pratik bulduğum bir şey. Daha iyi bir referansınız varsa lütfen paylaşın. Ben her zaman daha fazlasını öğrenmeye açıkım.
grahamesd

@grahamesd Uygulama, mimari tasarım prensibi / modelinden farklı bir şeydir. Hiç kimse HATEOAS'ın bir gün hazır olmasını bekleyemez, ancak birisinin birçok kişi tarafından kabul edilebilir bir uygulama yaratma şansı vardır. Vinay ayrıca http yöntemlerini URL'lere ve belirli işlemlere (CRUD) eşleme hakkında yazdı, URL'leri önekle sürümlendirmenin daha pragmatik olduğunu, sorgu parametrelerine göre filtrelemenin bir yol olduğunu yazdı ... RESTful mimarisi ile yapın. Bir tür sözleşme hakkında yazdı. HTTP API için bu iyi, ancak RESTful demeyin.
marcinn

@grahamesd Bunu açıklayan bazı yayınlar: - medium.com/@andrea.chiarelli/… - restfulapi.net
marcinn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.