Как опросить обновления с помощью JSONP? - PullRequest
3 голосов
/ 01 августа 2010

У меня есть веб-сервер, который обновляет свои данные раз в минуту, и хочу сделать эти данные доступными для клиентов всех типов. Чтобы уменьшить пропускную способность, я настроил PHP-скрипт для поддержки условных GET, используя IF-MODIFIED-SINCE и / или IF-NONE-MATCH. Идея состоит в том, что клиенты могут опрашивать каждые 30 секунд и тем самым быть уверенными, что они ничего не пропустят, но также не получат дубликаты данных.

Это прекрасно работает для большинства типов клиентов, и я убедился, что он работает с клиентами, которые поддерживают стандартную семантику условного GET HTTP.

Но он не работает с JavaScript, потому что JSONP вставляет тег в DOM и позволяет браузеру обрабатывать вещи - и нет никакой поддержки (по крайней мере, я не знаю) для условных GET в теги.

Поэтому я изменил свой PHP-скрипт для поддержки передачи значения etag. Возвращенные данные содержат значение etag, уникальное для этой минуты. Когда клиент JavaScript получает данные с сервера, он сохраняет значение etag, чтобы он мог использовать это значение в последующих запросах. Запрос принимает форму:

http://api.mydomain.com/script.php?fmt=json&callback=jscallback&etag=ab79bc65e

Если etag данных не соответствует переданному etag, я отправляю новые данные.

Это все работает хорошо, и было удивительно легко кодировать с помощью jQuery. Моя дилемма, однако, что делать, если этаг совпадает. Я вижу два варианта:

  1. Вернуть HTTP 304 (без изменений)
  2. Вернуть HTTP 200 (ОК), но с возвращенными данными, содержащими только информацию заголовка (дата изменения, etag и т. Д.) И без фактических элементов данных.

Если я сделаю первый, то клиентский код JavaScript будет значительно упрощен. Браузер работает нормально, если получает ответ 304 на введенный тег . Но ... что-то беспокоит меня об этом решении. Я не знаю, что это такое, но, похоже, я зависел от поведения, которое может зависеть от браузера. Некоторые браузеры могут решить сообщить об ошибке, если он получает 304.

Выполнение второго потребовало бы немного больше работы на сервере, немного большей пропускной способности и потребовало бы, чтобы клиенты проверяли данные, чтобы увидеть, были ли данные обновлены. Это больше работа для всех, но она кажется чище.

Итак, на мой вопрос. Если бы вы писали клиент JavaScript для получения этих данных, что бы вы предпочли? Тихий сбой, который никогда не вызывает ваш "успех" обратный вызов? Или возврат «успеха», в котором нет данных (кроме статуса)? Третий вариант?

1 Ответ

2 голосов
/ 30 августа 2010

В отсутствие каких-либо обсуждений от других, я пошел сюда со своим инстинктом и реализовал второй вариант. Веб-сервер возвращает HTTP 200, и данные содержат код состояния «Не изменен» вместе с информацией заголовка, но без записей. Это делает JavaScript немного более сложным, но мешает мне зависеть от недокументированного поведения.

...