2012-02-28 2 views
2

Это связано с: How should I implement a COUNT verb in my RESTful web service?, Paging in a Rest Collection и Using the HTTP Range Header with a range specifier other than bytes?Заголовок Content-Range - разрешенные единицы?

На самом деле я думаю, что -1 оценили anwser здесь правильно https://stackoverflow.com/a/1434701/1237617

Вообще anwsers говорят, что вы можете использовать пользовательские блоки со ссылкой на 3,12 сек

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

Однако, прочитав спецификацию HTTP, обратите внимание, что производственные правила:

Content-Range = "Content-Range" ":" content-range-spec 
    content-range-spec  = byte-content-range-spec 
    byte-content-range-spec = bytes-unit SP 
          byte-range-resp-spec "/" 
          (instance-length | "*") 

Спецификация заголовка ссылается только на байты от sec 3.12, а не на единицы измерения диапазона, поэтому я думаю, что на самом деле это против спецификации, чтобы использовать пользовательские единицы.

Я пропустил что-то или является популярным anwser неправильно?

EDIT: Поскольку это, вероятно, неясно, суть моего вопроса: rfc2616 sec14.16 только ссылки bytes-unit. Он никогда не упоминает дальность, поэтому производство диапазона не относится к Content-Range, и поэтому могут использоваться только байт-единицы.

Я думаю, что это относится к моим проблемам лучше всего, хотя мне нужно некоторое время, чтобы понять это (плюс я хотел убедиться, что в формулировке есть что-то не так).

Это отражает тот факт, что, по-видимому, первый набор правил грамматики специально сделано для синтаксического анализа и второй один для получения HTTP-запросов

благодаря elgaton

ответ

2

Спецификация, будучи пересмотренной, позволяет настраивать единицы измерения. См. HTTPbis Part 5, Section 2.

+1

Спасибо за информацию, но я вступил в решение для текущего стандарта. –

+1

Jakub, каково практическое влияние статуса публикации новой спецификации? –

+1

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

2

Если вы читаете HTTP/1.1 RFC, section 3.12, вы увидите, что:

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

Таким образом, токен other-range-unit был введен только для того, чтобы сделать серверы более «либеральными» при принятии. Это отражает тот факт, что, по-видимому, первый набор правил грамматики был специально создан для синтаксического анализа, а второй для создания HTTP-запросов, чтобы серверы могли принимать даже недействительные запросы (их просто игнорируют), и клиенты будут использовать только универсально принятый блок bytes.

Поэтому, лично я рекомендую:

  1. использование только bytes блока, когда он действует в качестве клиента, и
  2. принимают другие единицы (отбрасывая заголовок Content-Range, если они являются недействительными), когда он действует в качестве сервера ,
+0

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

+0

В производстве есть только отметить тот факт, что серверы должны принимать (и молча отбрасывать) даже неизвестные единицы; в случае, если спецификация HTTP/1.1 будет пересмотрена (в этом случае, как отметил @Julian Reschke), и клиент, поддерживающий новые спецификации, разговаривает с сервером, поддерживающим только старый, последний будет по-прежнему способен анализировать и обрабатывать запрос без ошибок. (Помните, что в HTTP клиент немедленно отправляет запрос без проверки того, какие версии протокола поддерживаются сервером, поэтому он не знает, если не будет возвращена ошибка 505). –

1

Это чисто личное мнение, но я думаю, что он вполне согласуется с тем, как используются другие HTTP-расширения (пользовательские методы или заголовки). Вот как я его читаю: да, я могу использовать пользовательские диапазоны диапазона и нет, я не должен отправлять отчет об ошибке, когда он игнорируется при прохождении через брандмауэры, веб-прокси и другие посредники. Я согласен с спецификацией HTTP при отправке, и они соответствуют HTTP, когда они игнорируют его. WebDAV правильно использует HTTP-расширения, IMO, но редко работает через Интернет именно по этой причине. Как я уже сказал, личное мнение.

+0

Это интересный момент - я ожидаю, что это сломает кеширование. Я имею в виду, что он не будет «не работать», но он будет кэшировать и частично обслуживать неполный контент как полный ресурс, если заголовок игнорируется? –

+0

13.4 говорит: «Однако кеш, который не поддерживает заголовки Range и Content-Range, НЕ ДОЛЖЕН кэшировать ответы 206 (частичный контент)», хотя я не уверен, что если игнорировать заголовок считается «не поддерживающим» для puprose этот отрывок. –

0

Очевидно, это нормально использовать пользовательские единицы, потому что:

Это отражает тот факт, что, по-видимому, первый набор грамматики правил были специально сделаны для синтаксического анализа, а второй для выпускающих запросов HTTP

Смежные вопросы