JSON belgelerinin koleksiyonlarına doğrudan bir REST arayüzü göstermek istiyorum ( CouchDB veya Persevere düşünün ). Karşılaştığım sorun GET
, koleksiyon büyükse koleksiyon kökündeki işlemin nasıl yapılacağıdır .
Örnek olarak, StackOverflow'un Questions
tablosunu her satırın bir belge olarak gösterdiği tabloyu açığa vuruyorum (böyle bir tablo olması gerekmiyor, sadece 'belgeler'in büyük bir koleksiyonunun somut bir örneği değil). Toplama mevcut hale getirilebileceğini /db/questions
zamanki CRUD API ile GET /db/questions/XXX
, PUT /db/questions/XXX
, POST /db/questions
oyunda. Tüm koleksiyonu almanın standart yolu şudur, GET /db/questions
ancak bu her satırı bir JSON nesnesi olarak saf bir şekilde dökerse, oldukça büyük bir indirme ve sunucunun bir çok işini alırsınız.
Çözüm, elbette, çağrıdır. Dojo, JsonRestStore'daki bu sorunu , Range
başlığı özel bir aralık birimiyle kullanmanın akıllı RFC2616 uyumlu bir uzantısıyla çözdü items
. Sonuç, 206 Partial Content
yalnızca istenen aralığı döndüren bir sonuçtur . Bir sorgu parametresine göre bu yaklaşımın avantajı, ... sorguları için sorgu dizesini GET /db/questions/?score>200
bırakmasıdır (örn. Veya somesuch ve evet kodlanır %3E
).
Bu yaklaşım tamamen istediğim davranışı kapsar. Sorun, RFC 2616'nın 206 yanıtta (vurgu mayın) şunları belirtmesidir:
Talep Aralık başlık alanını (içeriyor olmalıdır bölüm 14.35 ), istenen aralık ile ve varsa sınıf başlık alanını (dahil edilmiş olabilir bölüm 14.27 talep koşullu yapmak için).
Bu, başlığın standart kullanımı bağlamında mantıklıdır, ancak bir sorundur çünkü 206 yanıtın, naif istemcileri / rastgele insanları keşfetme varsayılanı olmasını istiyorum.
Bir çözüm arayan RFC'yi ayrıntılı olarak inceledim, ancak çözümlerimden memnun kalmadım ve SO'nun sorunu ele almasıyla ilgileniyorum.
Sahip olduğum fikirler:
200
BirContent-Range
başlık ile geri dönün ! - Bunun yanlış olduğunu düşünmüyorum, ancak yanıtın yalnızca Kısmi İçerik olduğunu daha açık bir gösterge olarak tercih ederim.- Dönüş
400 Range Required
- Gerekli üstbilgiler için özel bir 400 yanıt kodu yoktur, bu nedenle varsayılan hatanın kullanılması ve elle okunması gerekir. Bu aynı zamanda web tarayıcısı (veya Resty gibi başka bir istemci) aracılığıyla araştırmayı zorlaştırır. - Bir sorgu parametresi kullanın - Standart yaklaşım, ancak ben la Persevere sorgu izin vermek umuyoruz ve bu sorgu ad alanı keser.
- Sadece geri dön
206
! - Bence çoğu müşteri çıldırmaz, ama RFC'de bir zorunlulukla karşı karşıya kalmamayı tercih ederim - Spesifikasyonu uzatın! Dönüş
266 Partial Content
- Tam 206 gibi davranır, ancakRange
üstbilgiyi İÇERMEMELİ bir isteğe yanıt verir . 266'nın çarpışma sorunlarıyla karşılaşmamaya yetecek kadar yüksek olduğunu ve benim için mantıklı olduğunu düşünüyorum, ancak bunun tabu olarak kabul edilip edilmediği konusunda net değilim.
Bunun oldukça yaygın bir sorun olduğunu düşünüyorum ve bunun bir çeşit fiili tarzda yapıldığını görmek istiyorum, bu yüzden ben veya başka biri tekerleği yeniden icat etmiyor.
Koleksiyon büyük olduğunda HTTP aracılığıyla tam bir koleksiyon göstermenin en iyi yolu nedir?
Range = "Range" ":" ranges-specifier
, tools.ietf.org/html/rfc2616#section-14.35.1 içindeki sonuncunun yalnızca, "dize olarak tanımlanan" byte-birim "ile başlaması gereken" byte-ranges-specifier "olarak tanımlandığını belirtir. ".
Content-Range
Başlığı (indirirken vb büyük dosyaları yüklerken isteği ile kullanılabilir veya yanıt için olabilir) vücuda uygulanır. Range
Başlık belirli bir aralığı talep etmek için kullanılır. Başlık isteğe 206
ne zaman Range
dahil edildiğine yanıt verilmelidir . Değilse, yanıt yine de bir Content-Range
başlık içerebilir , ancak yanıt kodu olmalıdır 200
. Bu başlık aslında sayfalama için ideal görünüyor.