2014-10-14 7 views
8

API'mda "değişiklik değerleri al" özelliğini uygulamak istiyorum. Örneğin, şu REST API çağrısı var:Bir If-Modified-Since başlığına dayalı bir REST API temsilini değiştirmek için geçerli mi?

Bu, # 7 numaralı okuldaki tüm öğrencileri alır. Ne yazık ki, bu çok olabilir. Bu nedenle, yalnızca belirli bir zamandan beri değiştirilmiş olan öğrenci kayıtlarını döndürmek için API'yi değiştirmek istiyorum. (Kullanma durumu her gece bir süreç onların benim sistemden tüm öğrencileri çekmek için başka bir sistemden ishal.)

Ben http://blog.mugunthkumar.com/articles/restful-api-server-doing-it-the-right-way-part-2/ başlığındaki beri-modifiye eğer-ve bir temsilini dönen aşağıdaki gibi kullanılmasını önerir bkz:

  • Arama tüm öğrencilerin istenilen yana güncellenen değişiklikte-beri başlığında
  • herhangi varsa, bir 200 OK
  • varsa hiçbir öğrenci bu sorgudan döndürülen
  • , dönüş karşısında öğrencilere iade Bir 304 Değiştirilmemiş

Ne yapmak istediğini anlıyorum, ama bunun yanlış gitmesi gerekiyor. tanımı ise-Modified-yana başlığı (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.24) der:

Eğer-Modified-yana istek başlık alanı koşullu yapmak için bir yöntem ile kullanılır: istenen varyant sonra değiştirilmiş edilmemiş ise Bu alanda belirtilen süre, bir sunucudan sunucuya iade edilmeyecektir; bunun yerine, herhangi bir mesaj gövdesi olmadan bir 304 (değiştirilmemiş) yanıtı iade edilecektir.

Bu benim için yanlış görünüyor. RFC tarafından belirtildiği gibi gösterim veya bir 304'ü iade etmeyeceğiz, ancak bazı melezler. İstemci yan kodu (veya daha kötüsü, sunucu ve istemci arasındaki bir web önbelleği) anlamı yanlış yorumlayabiliyor ve yerel önbelleğe alınmış değeri değiştirebiliyor.

Yani, iki soru:

  • bu başlığın doğru kullanımı var mı?
  • Değilse (ve bundan şüpheleniyorum), en iyi uygulama hangisidir? Sorgu dizesi parametresi?

cevap

7

Bu, başlığın doğru kullanımı değildir. If-Modified-Since başlığı, bir kaynak istendiğinde sunucuya bir HTTP istemcisinin (tarayıcı veya kod) isteğe bağlı olarak kaynağı verilebilmesidir. Eğer sağlanmışsa, anlamı "Kaynak X istiyorum ama sadece zamandan beri değiştiyse". Amacı, kaynakların istemci tarafındaki önbelleğe alınmasına izin vermektir.

Önerilen kullanımınızın semantiği "Zaman T'den bu yana olan X koleksiyonu için güncelleştirme istiyorum." Bu, X'in bir alt kümesi için bir istektir. Motivasyonunuz, önbelleğe almayı etkinleştirmek gibi görünmüyor. İstemci tarafındaki önbelleğe alınmış temsiliniz, X'in tümünü içerir; ancak, normal istek yalnızca size X'te küçük bir değişiklik kümesi döndürse de; Bu, yanıtın doğrudan önbelleğe aldığınız değil, bu nedenle önbelleğe alma özel kullanıcı mantıksal istemci tarafında gerçekleşmesi gerekir.

Bir sorgu dizesi parametresi çok daha uygun bir çözümdür. {seq}'un altında bir sıra numarası veya zaman damgası gibi bir şey olurdu.Sana hayal

GET /ws/schools/7/students/updates?since={seq} 

Sunucu tarafı sisteminizin başından beri güncellemeleri bir diziyi ve {seq} daha büyük bir sekans değeri vardı ilk N güncellemelerini kapmak istiyorum Yukarıdaki formun bir ricam var. Böylelikle, bir müşterinin çok geride kalmış ve yetişmesi gerekiyorsa, sonuçlara çağrı yapılırdı.

+0

Doğrulama için teşekkürler, bas adam. Tam da benim düşüncem vardı. – fool4jesus