Использование заголовка диапазона HTTP с указателем диапазона, отличным от байтов? - PullRequest
15 голосов
/ 16 сентября 2009

Основной вопрос касается использования заголовков HTTP, включая Range , If-Range , Accept-Ranges и определенный пользователем диапазон.

Вот сфабрикованный пример, чтобы проиллюстрировать мой вопрос. Предположим, у меня есть приложение в стиле Web 2.0, которое отображает какие-то удобочитаемые документы. Эти документы редакционно разбиты на страницы (аналогично статьям, которые вы видите на новостных сайтах). Для этого примера предположим:

  • Существует документ под названием «HTTP Range Question», разбитый на три страницы.
  • Страница оболочки (/document/shell/http-range-question) знает метаинформацию о документе, включая количество страниц.
  • Первая читаемая страница документа загружается во время события загрузки страницы через ajax GET и вставляется на страницу.
  • Элемент управления пользовательского интерфейса, который выглядит как [1 2 3 All] , находится внизу страницы, и нажатие на число отобразит эту читаемую страницу (также загружаемую через ajax) и нажав «Все» "отобразит весь документ. Предположим, эти URL-адреса для 1, 2, 3 и всех вариантов использования:
    • /document/content/http-range-question?page=1
    • /document/content/http-range-question?page=2
    • /document/content/http-range-question?page=3
    • /document/content/http-range-question

Теперь к вопросу. Могу ли я использовать заголовки диапазона HTTP вместо части URL (например, параметр строки запроса)? Может быть, что-то вроде этого по запросу GET /document/content/http-range-question:

Range: page=1

Похоже, что спецификация определяет только допустимые диапазоны байтов, поэтому, даже если я заставлю свои вызовы ajax работать с моим браузером и кодом сервера, все, что находится посередине, может нарушить контракт (например, кеширующий прокси-сервер).

Range: bytes=0-499

Есть ли какие-либо мнения или примеры реальных спецификаторов диапазона?

Обновление : я нашел похожий вопрос о заголовке Range ( Пейджинг в коллекции отдыха ), где они упоминают, что Dojo JsonRestStore использует пользовательский Range значение заголовка.

Range: items=0-24

Ответы [ 4 ]

33 голосов
/ 21 февраля 2011

Абсолютно - вы можете указать любые единицы измерения, которые вам нравятся.

Из RFC 2616:

3.12 Единицы измерения диапазона

HTTP / 1.1 позволяет клиенту запрашивать эта единственная часть (диапазон)
Ответный объект должен быть включен в ответ. HTTP / 1.1 использует единицы измерения диапазона в диапазоне (раздел 14.35) и Диапазон содержимого (раздел 14.16)
поля заголовка. Сущность может быть сломана вниз в поддиапазоны в соответствии с различные структурные единицы.

  range-unit       = bytes-unit | other-range-unit
  bytes-unit       = "bytes"
  other-range-unit = token

Единственная единица измерения дальности, определяемая как HTTP / 1.1 - это «байты». HTTP / 1.1
реализации МОГУТ игнорировать диапазоны указано с использованием других единиц.

Ключевым элементом является последний абзац. На самом деле, это говорит о том, что когда они писали спецификацию для HTTP / 1.1, они только обрисовали в общих чертах маркер «байтов». Но, как вы можете видеть из бита 'other-range-unit', вы свободны придумывать свои собственные спецификаторы токенов.

Использование ваших собственных спецификаторов Range означает, что вы должны контролировать код клиента и сервера, который использует этот спецификатор. Итак, если у вас есть серверная часть, предоставляющая URI «/ document / content / http-range-question», все готово; по-видимому, вы используете современную веб-среду, которая позволяет вам проверять поступающие заголовки запросов. Затем вы можете посмотреть на значения Range, чтобы правильно выполнить запрос поддержки.

Кроме того, если вы управляете кодом AJAX, который делает запросы к бэкэнду, вы сможете установить заголовок Range самостоятельно.

Однако есть потенциальная обратная сторона, которую вы ожидаете в своем вопросе: возможность сломать кеширование. Если вы используете пользовательский модуль Range, любые кэши между вашим клиентом и исходными серверами «МОГУТ игнорировать диапазоны, указанные с использованием [единиц измерения, отличных от« байтов »]». Так, например, если у вас был кеш Squid / Varnish между передней и задней панелью, нет никакой гарантии, что результаты, на которые вы надеетесь, будут получены из кеша!

Вы могли бы также рассмотреть альтернативную реализацию, где вместо использования строки запроса вы делаете страницу «параметром» URI; например: / document / content / http-range-question / page / 1. Скорее всего, это будет немного больше работы для вас на стороне сервера, но он совместим с HTTP / 1.1, и кэши должны обрабатывать его правильно.

Надеюсь, это поможет.

0 голосов
/ 25 марта 2013

байт - единственная единица, поддерживаемая спецификацией HTTP 1.1.

0 голосов
/ 16 сентября 2009

HTTP Range обычно используется для восстановления прерванных загрузок без начала с начала.

То, что вы пытаетесь сделать, было бы лучше обработано OAI-ORE , которое позволяет вам определять отношения между несколькими документами. (альтернативные форматы, компоненты целого и т. д.)

К сожалению, это относительно новый формат метаданных, и я не знаю ни одного веб-браузера, который поставляется с собственной поддержкой.

0 голосов
/ 16 сентября 2009

Звучит так, будто вы хотите изменить спецификацию HTTP, просто удалив параметр строки запроса. Чтобы сделать это, вам нужно изменить код на клиенте для отправки измененного заголовка и на сервер для чтения из заголовка «Range» вместо строки запроса.

Конечным результатом является то, что это, вероятно, сработает, но вы нарушаете все стандарты и существующие инструменты для этого.

...