2010-07-31 73 views
3

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

这对所有类型的客户端都很有用,而且我已经验证它可以与支持标准HTTP条件GET语义的客户端协同工作。

但由于JSONP插入<脚本>标签到DOM,让浏览器手柄的东西它不使用JavaScript工作 - 而且也没有支持(至少没有我所知道的)为条件获取<脚本>标签。

所以我修改了我的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等)返回的数据和没有实际的数据项目。

如果我做第一个,那么JavaScript客户端代码将大大简化。如果浏览器对注入的<脚本>标记获得304响应,则该浏览器似乎可以正常工作。但是......这个解决方案让我感到困扰。我不知道它是什么,但似乎我依赖于可能是特定于浏览器的行为。某些浏览器可能会决定报告一个错误,如果它得到一个304.

做第二次将需要在服务器上稍微多一点工作,稍微多些带宽,并且需要客户端检查数据以查看数据已更新。这对每个人来说都是更多的工作,但它似乎更清洁。

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

回答

2

在没有与他人进行任何讨论的情况下,我在这里和我一起去了解并实施了第二种选择。 Web服务器返回HTTP 200,并且数据包含“未修改”状态代码以及标题信息,但没有记录。这使得JavaScript稍微复杂一点,但阻止了我依赖于无证行为。