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 POSTyö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.
PATCHKarşı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 POSTve PATCHher öğ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 PUTbiraz 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 POSTveya yoksa dokümanı oluşturduktan sonra PATCHtanımlayıcıya binderIdsahip 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 200dö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 /docsalmak 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=xya da ben demeliyimDELETE /docsbir ile{"binder_id": x}isteği gövdesine? HiçPATCH /docs?binder_id=xtoplu güncelleme için kullanır mıydınız yoksa sadecePATCH /docsve çiftleri geçirir miydiniz ?