3

我有一个每分钟更新一次数据的 Web 服务器,并希望将这些数据提供给所有类型的客户端。为了减少带宽,我设置 PHP 脚本以支持条件 GET,使用 IF-MODIFIED-SINCE 和/或 IF-NONE-MATCH。这个想法是客户端可以每 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 等),没有实际数据项。

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

做第二个需要在服务器上做更多的工作,需要更多的带宽,并且需要客户端检查数据以查看数据是否已更新。这对每个人来说都是更多的工作,但它看起来更干净。

So, to my question. If you were writing a JavaScript client to get this data, which would you prefer? A silent failure that never calls your "success" callback? Or a "success" return that has no data (beyond status) in it? A third option?

4

1 回答 1

2

Absent any discussion from others, I went with my gut here and implemented the second option. The web server returns an HTTP 200, and the data contains a "Not Modified" status code along with header information, but no records. That makes the JavaScript just slightly more complicated, but prevents me from depending on undocumented behavior.

于 2010-08-30T19:45:10.280 回答