2010-07-31 82 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稍微複雜一點,但阻止了我依賴於無證行爲。