Idem gücü
RFC'nin ardından, bir PUT kaynağa tam nesne teslim etmek zorunda kalacaktır. Bunun temel nedeni, PUT'un önemsiz olması gerektiğidir. Bu, tekrarlanan bir isteğin sunucuda aynı sonucu değerlendirmesi gerektiği anlamına gelir.
Kısmi güncellemelere izin verirseniz, artık etkili olamaz. Eğer iki müşteriniz varsa. Müşteri A ve B, ardından aşağıdaki senaryo gelişebilir:
Müşteri A kaynak resimlerden bir resim alır. Bu, görüntünün hala geçerli olan bir açıklamasını içerir. B müşterisi yeni bir görüntü ekler ve açıklamayı uygun şekilde günceller. Resim değişti. A İstemcisi görür, açıklamasını değiştirmek zorunda değildir, çünkü istediği gibidir ve yalnızca görüntüyü koyar.
Bu tutarsızlığa yol açacaktır, resmin üzerine yanlış meta veri eklenmiş!
Daha da fazla sinir bozucu olması, herhangi bir aracının talebi tekrar etmesi olabilir. Bir şekilde karar vermesi durumunda PUT başarısız oldu.
PUT'un anlamı değiştirilemez (yanlış kullanmanıza rağmen).
Diğer seçenekler
Neyse ki başka bir seçenek var, bu PATCH. PATCH, bir yapıyı kısmen güncellemenizi sağlayan bir yöntemdir. Kısmi bir yapı gönderebilirsiniz. Basit uygulamalar için bu iyi. Bu yöntem idem güçlü olduğu garanti edilmez. Müşteri, aşağıdaki şekilde bir istek göndermelidir:
PATCH /file.txt HTTP/1.1
Host: www.example.com
Content-Type: application/example
If-Match: "e0023aa4e"
Content-Length: 20
{fielda: 1, fieldc: 2}
Ve sunucu başarıyı işaretlemek için 204 (içerik yok) ile cevap verebilir. Hata durumunda yapının bir bölümünü güncelleyemezsiniz. PATCH metodu atomiktir.
Bu yöntemin dezavantajı, tüm tarayıcıların bunu desteklememesi, ancak bu bir REST hizmetindeki en doğal seçenektir.
Örnek yama isteği:
http://tools.ietf.org/html/rfc5789#section-2.1
Json yaması
Json seçeneği oldukça kapsamlı ve ilginç bir seçenek gibi görünüyor. Ancak üçüncü şahıslar için uygulanması zor olabilir. Kullanıcı tabanınızın bunu yapıp yapamayacağına karar vermelisiniz.
Aynı zamanda biraz karmaşıktır, çünkü komutlarınızı modelinizi güncellemek için kullanacağınız kısmi bir yapıya dönüştüren küçük bir tercüman oluşturmanız gerekir. Bu tercüman ayrıca verilen komutların anlam ifade edip etmediğini de kontrol etmelidir. Bazı komutlar birbirini iptal eder. (fielda yaz, fielda sil). Sanırım, tarafındaki hata ayıklama süresini sınırlandırmak için bunu müşteriye geri rapor etmek istiyorsunuz.
Ancak zamanınız varsa, bu gerçekten zarif bir çözüm. Elbette ki alanları doğrulamalısınız. REST modelinde kalmak için bunu PATCH yöntemiyle birleştirebilirsiniz. Ancak POST'un burada kabul edilebilir olacağını düşünüyorum.
Kötü gidiyor
PUT seçeneği ile gitmeye karar verirseniz, bu biraz riskli. O zaman en azından hatayı atmamalısınız. Kullanıcının belli bir beklentisi vardır (veriler güncellenecektir) ve eğer bunu kırarsanız, bazı geliştiricilere iyi zaman vermeyeceksiniz.
Geri işaretlemeyi tercih edebilirsiniz: 409 Uyuşmazlık ya da 403 Yasak. Güncelleme işlemine nasıl baktığınıza bağlı. Bir dizi kural (sistem merkezli) olarak görürseniz, çatışma daha iyi olacaktır. Gibi bir şey, bu alanlar güncelleştirilebilir değil. (Kurallara aykırı). Bir yetkilendirme sorunu olarak görürseniz (kullanıcı merkezli), o zaman yasakla geri dönmelisiniz. Şunlarla: bu alanları değiştirme yetkiniz yok
Kullanıcıları hala tüm değiştirilebilir alanları göndermeye zorlamalısınız.
Bunu uygulamak için makul bir seçenek, yalnızca değiştirilebilir verileri sunan bir alt kaynağa ayarlamaktır.
Kişisel görüş
Şahsen basit PATCH modeli için (tarayıcılarla çalışmak zorunda kalmazsanız) gider ve daha sonra bir JSON yama işlemcisi ile genişletirim. Bu, mimetipleri farklılaştırarak yapılabilir: Mson tipi json yaması:
uygulama / json yama
Ve json: uygulama / json-patch
iki aşamada uygulamayı kolaylaştırır.