Genellikle bunun için tasarladıkları için, bunu işlemek için bir POST veya PATCH yöntemi kullanabileceğinizi düşünüyorum.
Bir POST
yöntem kullanmak , genellikle liste kaynağında kullanıldığında bir öğe eklemek için kullanılır, ancak bu yöntem için birkaç eylemi de destekleyebilirsiniz. Bu yanıta bakın: REST Kaynak Koleksiyonu Nasıl Güncellenir . Giriş için farklı gösterim biçimlerini de destekleyebilirsiniz (bir diziye veya tek bir öğeye karşılık geliyorlarsa).
Bu durumda, güncellemeyi açıklamak için formatınızı tanımlamanıza gerek yoktur.
PATCH
Karşılık gelen istekler kısmi güncellemeye karşılık geldiğinden, bir yöntemin kullanılması da uygundur. RFC5789'a göre ( http://tools.ietf.org/html/rfc5789 ):
Köprü Metni Aktarım Protokolünü (HTTP) genişleten birkaç uygulama, kısmi kaynak değişikliği yapmak için bir özellik gerektirir. Mevcut HTTP PUT yöntemi yalnızca bir belgenin tamamen değiştirilmesine izin verir. Bu teklif, mevcut bir HTTP kaynağını değiştirmek için yeni bir HTTP yöntemi olan PATCH ekler.
Bu durumda, kısmi güncellemeyi açıklamak için formatınızı tanımlamanız gerekir.
Bence bu durumda POST
ve PATCH
her öğe için yapılacak işlemi gerçekten açıklamanıza gerek olmadığı için oldukça benzer. Gönderilecek temsilin formatına bağlı olduğunu söyleyebilirim.
Durum PUT
biraz daha az net. Aslında, bir yöntem kullanırken PUT
, tüm listeyi sağlamalısınız. Nitekim, talepte sağlanan temsil, liste kaynağı olanın yerine geçecektir.
Kaynak yollarıyla ilgili iki seçeneğiniz olabilir.
- Belge listesi için kaynak yolunu kullanma
Bu durumda, talepte sağladığınız temsilde belge bağlantısını açıkça bir bağlayıcı ile sağlamanız gerekir.
İşte bunun için örnek bir yol /docs
.
Bu tür bir yaklaşımın içeriği yöntem için olabilir POST
:
[
{ "doc_number": 1, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 2, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 3, "binder": 5, (other fields in the case of creation) },
(...)
]
- Bağlayıcı öğesinin alt kaynak yolunu kullanma
Ek olarak, dokümanlar ve bağlayıcılar arasındaki bağlantıyı açıklamak için alt yollardan yararlanmayı da düşünebilirsiniz. Bir doküman ve bir ciltçi arasındaki ilişkiye ilişkin ipuçlarının artık istek içeriğinde belirtilmesi gerekmez.
İşte bunun için örnek bir yol /binder/{binderId}/docs
. Bu durumda, bir yöntemle doküman listesi göndermek POST
veya yoksa dokümanı oluşturduktan sonra PATCH
tanımlayıcıya binderId
sahip bağlayıcıya dokümanlar ekleyecektir .
Bu tür bir yaklaşımın içeriği yöntem için olabilir POST
:
[
{ "doc_number": 1, (other fields in the case of creation) },
{ "doc_number": 2, (other fields in the case of creation) },
{ "doc_number": 3, (other fields in the case of creation) },
(...)
]
Yanıtla ilgili olarak, yanıt düzeyini ve döndürülecek hataları tanımlamak size kalmıştır. İki seviye görüyorum: durum seviyesi (genel seviye) ve yük seviyesi (daha ince seviye). İsteğinize karşılık gelen tüm eklerin / güncellemelerin atomik olup olmayacağını belirlemek de size bağlıdır.
Bu durumda, HTTP durumundan yararlanabilirsiniz. Her şey yolunda giderse, bir statü alırsınız 200
. Değilse 400
, sağlanan verilerin doğru olmaması gibi başka bir durum (örneğin bağlayıcı kimliği geçerli değil) veya başka bir şey.
Bu durumda, bir durum 200
döndürülür ve ne yapıldığını ve sonunda hataların nerede oluştuğunu açıklamak yanıt temsiline bağlıdır. ElasticSearch, toplu güncelleme için REST API'sinde bir uç noktaya sahiptir. Bu size bu düzeyde bazı fikirler verebilir: http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/bulk.html .
Ayrıca, sağlanan verileri işlemek için zaman uyumsuz bir işlem de uygulayabilirsiniz. Bu durumda, HTTP durum geri dönüşleri olacaktır 202
. Müşterinin ne olacağını görmek için ek bir kaynak çekmesi gerekir.
Bitirmeden önce, OData belirtiminin varlıklar arasındaki ilişkilerle ilgili sorunu gezinme bağlantıları adı verilen özellik ile ele aldığını da fark etmek isterim . Belki şuna bir bakabilir misin ;-)
Aşağıdaki bağlantı da size yardımcı olabilir: https://templth.wordpress.com/2014/12/15/designing-a-web-api/ .
Umarım sana yardımcı olur, Thierry
GET /docs
almak için belirli bir cilt içindeki tüm dokümanları arar ve alırımGET /docs?binder_id=x
. Kaynakların bir alt kümesi ben çağırır silmek içinDELETE /docs?binder_id=x
ya da ben demeliyimDELETE /docs
bir ile{"binder_id": x}
isteği gövdesine? HiçPATCH /docs?binder_id=x
toplu güncelleme için kullanır mıydınız yoksa sadecePATCH /docs
ve çiftleri geçirir miydiniz ?