如何使用JSONP轮询更新?

时间:2010-07-31 21:59:19

标签: jsonp polling

我有一个Web服务器,每分钟更新一次数据,并希望将这些数据提供给所有类型的客户端。为了减少带宽,我使用IF-MODIFIED-SINCE和/或IF-NONE-MATCH设置PHP脚本以支持条件GET。这个想法是客户可以每30秒轮询一次,从而确保他们不会错过任何内容,但也不会获得重复数据。

这一切都适用于大多数类型的客户端,并且我已经验证它适用于支持标准HTTP条件GET语义的客户端。

但它不适用于JavaScript,因为JSONP会插入一个< script>标记到DOM中并让浏览器处理事情 - 并且在< script>中对条件GET没有任何支持(至少,我不知道)标签

所以我修改了我的PHP脚本以支持传递etag值。返回的数据包含该分钟唯一的etag值。当JavaScript客户端从服务器接收数据时,它会保存etag值,以便它可以在后续请求中使用该值。请求采用以下形式:

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

如果数据的etag与传递的etag不匹配,那么我发送新数据。

这一切都运行良好,使用jQuery编写代码非常容易。我的困境,但如果etag匹配该怎么办。我看到两个选择:

  1. 返回HTTP 304(未修改)
  2. 返回HTTP 200(OK),但返回的数据只包含标题信息(修改日期,etag等),没有实际数据项。
  3. 如果我先做,那么JavaScript客户端代码将大大简化。如果对注入的< script>获得304响应,浏览器似乎工作得很好。标签。但是......这个解决方案让我感到烦恼。我不知道它是什么,但似乎我依赖于可能是浏览器特定的行为。如果某个浏览器获得304,则可能会决定报告错误。

    执行第二项操作需要在服务器上进行更多工作,带宽稍微增加,并且需要客户端检查数据以查看数据是否已更新。这对每个人来说都是更多的工作,但它看起来更清晰。

    所以,对我的问题。如果您正在编写JavaScript客户端来获取此数据,您更喜欢哪种?从未称之为“成功”回调的无声失败?还是一个没有数据(超出状态)的“成功”回报?第三种选择?

1 个答案:

答案 0 :(得分:2)

在没有其他人的讨论的情况下,我选择了我的直觉并实施了第二个选项。 Web服务器返回HTTP 200,数据包含“未修改”状态代码以及标头信息,但没有记录。这使得JavaScript稍微复杂一些,但阻止我依赖于未记录的行为。