我有一台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匹配,那该怎么办。我看到两个选择:
- 返回HTTP 304(未修改)
- 返回HTTP 200(OK),但与仅包含报头信息(修改的日期,ETAG等)返回的数据和没有实际的数据项目。
如果我做第一个,那么JavaScript客户端代码将大大简化。如果浏览器对注入的<脚本>标记获得304响应,则该浏览器似乎可以正常工作。但是......这个解决方案让我感到困扰。我不知道它是什么,但似乎我依赖于可能是特定于浏览器的行为。某些浏览器可能会决定报告一个错误,如果它得到一个304.
做第二次将需要在服务器上稍微多一点工作,稍微多些带宽,并且需要客户端检查数据以查看数据已更新。这对每个人来说都是更多的工作,但它似乎更清洁。
所以,对我的问题。如果你正在编写一个JavaScript客户端来获取这些数据,你更喜欢哪一个?从未称之为“成功”回调的沉默失败?还是一个没有数据(超越状态)的“成功”回报?第三个选项?