Tüm makale verilerini güncelleme için API'ye geri göndermemiz gerekiyor ve çok kullanıcılı çalışma yapılamadı. Örneğin, editör 5 saniye daha eski veriler gönderebilir ve diğer bazı gazetecilerin sadece 2 saniye önce yaptığı düzeltmenin üzerine yazabilir ve bir makaleyi yayınlayanların içeriği güncellemeyle hiçbir şekilde bağlantısı olmadığı için bunu müşterilere açıklayamamın bir yolu yoktur.
Bu tür bir şey ne yaparsanız yapın bir meydan okumadır, Dağınık kaynak kontrolüne (mercurial, git, vb.) Benzer bir problemdir ve HTTP / ReST'de yazılan çözüm biraz benzer görünüyor.
Her ikisinin de üzerinde çalıştığı Alice ve Bob olmak üzere iki kullanıcınız olduğunu varsayalım /articles/lunch
. (netlik için, cevap kalın şekildedir)
İlk önce, Alice makaleyi yaratır.
PUT /articles/lunch HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic YWxpY2U6c2VjcmV0
Hey Bob, what do you want for lunch today?
301 Moved Permanently
Location: /articles/lunch/1
Sunucu bir kaynak oluşturmadı, çünkü isteğe eklenmiş bir "sürüm" yoktu, (bir tanımlayıcı varsayarak /articles/{id}/{version}
. Yaratmayı gerçekleştirmek için, Alice, oluşturacağı makalenin / sürümün URL'sine yönlendirildi. aracı daha sonra isteği yeni adreste yeniden uygular.
PUT /articles/lunch/1 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic YWxpY2U6c2VjcmV0
Hey Bob, what do you want for lunch today?
201 Created
Ve şimdi makale oluşturuldu. sonra, Bob makaleye bakar:
GET /articles/lunch HTTP/1.1
Host: example.com
Authorization: Basic Ym9iOnBhc3N3b3Jk
301 Moved Permanently
Location: /articles/lunch/1
Bob orada görünüyor:
GET /articles/lunch/1 HTTP/1.1
Host: example.com
Authorization: Basic Ym9iOnBhc3N3b3Jk
200 Ok
Content-Type: text/plain
Hey Bob, what do you want for lunch today?
Kendi değişikliğini eklemeye karar verir.
PUT /articles/lunch/1 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic Ym9iOnBhc3N3b3Jk
Hey Bob, what do you want for lunch today?
Does pizza sound good to you, Alice?
301 Moved Permanently
Location: /articles/lunch/2
Alice'te olduğu gibi, Bob yeni bir sürüm oluşturacağı yere yönlendirilir.
PUT /articles/lunch/2 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic Ym9iOnBhc3N3b3Jk
Hey Bob, what do you want for lunch today?
Does pizza sound good to you, Alice?
201 Created
Sonunda, Alice kendi makalesine eklemek istediğine karar verir:
PUT /articles/lunch/1 HTTP/1.1
Host: example.com
Content-Type: text/plain
Authorization: Basic YWxpY2U6c2VjcmV0
Hey Bob, what do you want for lunch today?
I was thinking about getting Sushi.
409 Conflict
Location: /articles/lunch/3
Content-Type: text/diff
---/articles/lunch/2
+++/articles/lunch/3
@@ 1,2 1,2 @@
Hey Bob, what do you want for lunch today?
-Does pizza sound good to you, Alice?
+I was thinking about getting Sushi.
Normal olarak yönlendirilmek yerine, müşteriye farklı bir durum kodu geri gönderilir; 409
bu, Alice'e dallamaya çalıştığı sürümün zaten dallanmış olduğunu söyler. Yeni kaynaklar yine de yaratıldı ( Location
başlıkta gösterildiği gibi ) ve ikisi arasındaki farklar yanıt organına dahil edildi. Alice şimdi, az önce yaptığı isteğin nasıl birleştirileceğini biliyor.
Tüm bu yeniden yönlendirme, PUT
tam olarak istek satırının istediği yerde yeni kaynakların yaratılmasını gerektiren anlamıyla ilgilidir. bu aynı zamanda POST
bunun yerine bir istek döngüsünü de kaydedebilir , ancak daha sonra sürüm numarasının, çizim amacıyla bana daha az açık görünen başka bir sihir tarafından talep edilmesi durumunda kodlanması gerekecekti, ancak muhtemelen hala gerçek bir API'de tercih edilecekti. istek / yanıt döngülerini en aza indirmek için.
api/article?action=publish
? Sorgu parametreleri, kaynağın durumunun bahsettiğiniz “algoritmaya” (veya eyleme) bağlı olduğu durumlar için tasarlanmıştır. Örnapi/articles?sort=asc
: geçerli