2013-05-08 9 views
7

Basit bir CRUD REST API'si tasarlıyorum. Bu benim ilk kez, tasarımımın mantıklı olup olmadığı konusunda geri bildirim almak istedim.Basit bir CRUD REST API'si nasıl tasarlanır

HTTP yöntemlerini kullanıyorum: GET, POST, DELETE ve UPDATE. API, verileri JSON biçiminde tüketir ve alır. Örnek URL bunun gibi olacaktır: rekor veritabanında oluşturulacak POST isteğinin ardından

GET (list): curl http://<domain>/myapp/rest/v1/colors 
POST: curl -XPOST http://<domain>/myapp/rest/v1/colors -d '{ 
     "name": "red", 
     "shade": "light" 
     }' 
GET (single item): curl http://<domain>/myapp/rest/v1/colors/2 
DELETE: curl -XDELETE http://<domain>/myapp/rest/v1/colors/2 
etc... 

Soru

. Bu nedenle, POST isteği yeni oluşturulan kaydın kimliğini döndürmeli mi? Yani bu kimlik UPDATE, DELETE and GET (single item)'da kullanılabilir mi?

+0

Bu, dinlenme hizmetinizi nasıl tasarladığınıza bağlıdır. Ya, bir POST isteği, yanıt gövdesi alabilir. – Joshi

+0

Teşekkürler, evet, bir POST'un bir vücut alabileceğini anlıyorum. Ancak, istek işleme koyulduktan sonra bir yanıt gönderebilirim, örneğin yeni oluşturulmuş kaydın kimliği 659'dur. – birdy

+0

Evet Bu veritabanlarını veritabanınızla senkronize edilmişse kullanabilirsiniz. – Joshi

cevap

5

HTTP specification tanımlar POST aşağıdaki gibidir: Bir kaynak başlangıç ​​sunucusu üzerinde oluşturuldu

, yanıt 201 (oluşturuldu) olabilir ve isteğe durumunu açıklar ve bunlara atıfta bulunan bir varlık içerir GEREKEN yeni kaynağa ve bir Konum başlığı (bkz. bölüm 14.30).

Yani bu aslında şu anlama gelir:

  • Sen
  • İsteğe içerebilir yeni oluşturulan kaynağın URI işaret ederek,
  • Bir Location başlık dönmelidir durum kodu olarak 201 Created dönmelidir Müşterinin, Location başlığından elde edilen değere karşı başka bir GET talebi göndermesine gerek kalmaması için POST yanıt gövdesindeki kaynağın temsili.
+0

güzel olmalıdır. Böylece üçüncü mermi, yeni oluşturulan ID – birdy

+4

No'yu iade edebildiğim anlamına gelir. İlk önce, URI * ID'dir (bundan dolayı isim). İkincisi, "kaynağın bir temsili" yazdım, yani "Konum" başlığındaki bağlantıyı takip ettiyseniz, esas olarak aynı olacağı anlamına gelir: Okuduğunuz JSON. –

1

POST, tek öğe için yeni url'ye bir yönlendirme döndürmelidir.

Muhtemelen URL'lerin sürüm tanımlayıcısını kaybetmek istersiniz. Temsillerinizi ve istemcinizi, çeşitli sürümleri zarif bir şekilde ele alacak şekilde tasarlayın, bunun yerine, tasarımlarınızı ve istemcinizi tasarlayın. Örneğin, bir müşteri belirli bir forma bağlı olmamalı, sadece gerçekte ihtiyaç duyduğu niteliklere bağlı olmalıdır.

Tanımınızdaki eksiklik HATEOAS ilkesidir, yani istemci herhangi bir URL'yi kodlamamalı, ancak diğer varlıkların temsilleri içinde daha fazla eylemin URL'lerini bulmamalıdır. URL'ler tarafından döndürülen sonuçlar için örnek bir doküman göstermediğinizden, bunu iyi bir şekilde yapıp yapmadığınızı anlayamayız.

this presentation'a bakın, bu konuyu açıklar ve ayrıca bazı Spring Kitaplıklarını uygulamak için yararlı olduğundan bahseder.

+0

Teşekkürler, HATEOAS prensibinin farkında değildim.btw etiketler eksik olsa bile, bunu başarmak için grails kullanıyorum. Etiketi ekleyeceğim. Bu nedenle, yalnızca kimliği döndürmek yerine, gönderi tek bir öğe için tam bir URL, yani 'http: // /myapp/rest/v1/colours/2' – birdy