Мне интересно разоблачить прямой интерфейс REST для коллекций документов JSON (подумайте CouchDB или Persevere). Проблема, с которой я столкнулся, заключается в том, как обрабатывать операцию GET
для корня коллекции, если коллекция велика.
В качестве примера притворяюсь, что я показываю таблицу StackOverflow Questions
, где каждая строка экспонируется как документ (не обязательно, чтобы такая таблица была всего лишь конкретным примером значительного набора "документов" ). Коллекция будет доступна в /db/questions
с обычным CRUD api GET /db/info/XXX
, PUT /db/info/XXX
, POST /db/questions
. Стандартный способ получить всю коллекцию - GET /db/questions
, но если это наивно сбрасывает каждую строку как объект JSON, вы получите довольно значительную загрузку и большую часть работы со стороны сервера.
Решение - это, разумеется, пейджинг. Dojo решил эту проблему в своем JsonRestStore с помощью умного расширения, совместимого с RFC2616, используя заголовок Range
с пользовательским диапазоном диапазона items
. Результатом является 206 Partial Content
, который возвращает только запрошенный диапазон. Преимущество этого подхода по параметру запроса состоит в том, что он оставляет строку запроса для... запросов (например, GET /db/info/?score>200
или что-то вроде того, и да, которые были бы закодированы %3E
).
Этот подход полностью охватывает поведение, которое я хочу. Проблема в том, что RFC 2616 указывает, что в ответе 206 (акцент мой):
запрос ДОЛЖЕН включить поле заголовка диапазона (раздел 14.35) указывая желаемый диапазон, и МОЖЕТ включать в себя диапазон If (раздел 14.27), чтобы сделать запрос условным.
Это имеет смысл в контексте стандартного использования заголовка, но является проблемой, потому что я хотел бы, чтобы ответ 206 был по умолчанию обрабатывать наивные клиенты/случайные люди, изучающие.
Я подробно рассмотрел RFC, ища решение, но был недоволен моими решениями, и я заинтересован в SO, чтобы решить эту проблему.
Идеи, которые у меня были:
- Верните
200
с заголовкомContent-Range
! - Я не думаю, что это неправильно, но я бы предпочел, чтобы более очевидный индикатор того, что ответ - это только частичный контент. - Возврат
400 Range Required
- для требуемых заголовков не существует специального кода ответа 400, поэтому ошибка по умолчанию должна использоваться и считываться вручную. Это также затрудняет исследование через веб-браузер (или какой-либо другой клиент, такой как Resty). - Использовать параметр запроса - стандартный подход, но я надеюсь разрешить запросы a la Persevere, и это сокращает пространство имен запросов.
- Просто верните
206
! - Я думаю, что большинство клиентов не будет волноваться, но я бы предпочел не идти против MUST в RFC. - Расширьте спецификацию! Return
266 Partial Content
- ведет себя точно так же, как 206, но отвечает на запрос, который НЕ ДОЛЖЕН содержать заголовокRange
. Я полагаю, что 266 достаточно высоко, чтобы я не сталкивался с проблемами столкновения, и это имеет смысл для меня, но я не понимаю, считается ли это табу или нет.
Я думаю, что это довольно распространенная проблема, и я хотел бы, чтобы это было сделано де-факто, поэтому я или кто-то еще не изобретает колесо.
Каков наилучший способ опубликовать полную коллекцию через HTTP при большой коллекции?