1 分に 1 回データを更新する Web サーバーがあり、そのデータをあらゆる種類のクライアントが利用できるようにしたいと考えています。帯域幅を削減するために、IF-MODIFIED-SINCE および/または IF-NONE-MATCH を使用して、条件付き GET をサポートするように PHP スクリプトをセットアップしました。クライアントは 30 秒ごとにポーリングできるため、何も見逃すことはなく、重複したデータを取得することもありません。
これはすべて、ほとんどの種類のクライアントでうまく機能し、標準の HTTP 条件付き GET セマンティクスをサポートするクライアントで機能することを確認しました。
しかし、JSONP は <script> タグを DOM に挿入し、ブラウザーに処理させるため、JavaScript では機能しません。また、<script> タグでの条件付き GET はサポートされていません (少なくとも、私が知っているものはありません)。
そこで、etag 値の受け渡しをサポートするように PHP スクリプトを変更しました。返されたデータには、その分に固有の etag 値が含まれています。JavaScript クライアントは、サーバーからデータを受信すると、etag 値を保存して、後続の要求でその値を使用できるようにします。リクエストの形式は次のとおりです。
http://api.mydomain.com/script.php?fmt=json&callback=jscallback&etag=ab79bc65e
データの etag が渡された etag と一致しない場合は、新しいデータを送信します。
これはすべてうまく機能し、jQuery を使用して驚くほど簡単にコーディングできました。私のジレンマは、etag が一致した場合にどうするかということです。2 つの選択肢があります。
- HTTP 304 を返す (未変更)
- HTTP 200 (OK) を返しますが、返されるデータにはヘッダー情報 (変更日、etag など) のみが含まれ、実際のデータ項目は含まれません。
最初に実行すると、JavaScript クライアント コードが大幅に簡素化されます。挿入された <script> タグに対して 304 応答が返された場合、ブラウザーは正常に動作しているように見えます。しかし...この解決策について何か気になります。それが何であるかはわかりませんが、ブラウザ固有の可能性のある動作に依存しているようです。一部のブラウザーは、304 を受け取った場合にエラーを報告することを決定する場合があります。
2 番目の方法を実行すると、サーバーでの作業が少し増え、帯域幅が少し増えます。また、クライアントはデータが更新されたかどうかを確認するためにデータをチェックする必要があります。誰にとってもより多くの作業ですが、よりクリーンに見えます。
それで、私の質問に。このデータを取得するために JavaScript クライアントを作成しているとしたら、どちらを選びますか? あなたの「成功」コールバックを決して呼び出さない静かな失敗?それとも、(ステータス以外の) データを含まない「成功」の戻り値ですか? 第三の選択肢?