API に「変更された値を取得」機能を実装したいと考えています。たとえば、次の REST API 呼び出しがあるとします。
GET /ws/school/7/student
これにより、学校 #7 のすべての生徒が取得されます。残念ながら、これは多いかもしれません。そのため、特定の時間以降に変更された学生の記録のみを返すように API を変更したいと考えています。(ユースケースは、夜間のプロセスが別のシステムから実行され、すべての学生を私のシステムから彼らのシステムにプルすることです。)
http://blog.mugunthkumar.com/articles/restful-api-server-doing-it-the-right-way-part-2/では、if-modified-since ヘッダーを使用して次のような表現を返すことを推奨しています。
- if-modified-since ヘッダーで要求された時間以降に更新されたすべての学生を検索します
- 生徒がいる場合は、200 OK でそれらの生徒を返します
- そのクエリから返された生徒がいない場合は、304 Not Modified を返します。
彼のやりたいことは理解できるが、これは間違ったやり方のようだ。If-Modified-Since ヘッダーの定義 ( http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.24 ) は次のように述べています。
If-Modified-Since リクエスト ヘッダー フィールドは、条件付きにするメソッドで使用されます。リクエストされたバリアントがこのフィールドで指定された時間以降に変更されていない場合、エンティティはサーバーから返されません。代わりに、メッセージ本文なしで 304 (変更されていない) 応答が返されます。
これは私には間違っているようです。RFC で示されているような表現や 304 を返すのではなく、いくつかのハイブリッドを返します。クライアント側のコード (またはさらに悪いことに、サーバーとクライアント間の Web キャッシュ) が意味を誤って解釈し、ローカルにキャッシュされた値を置き換えてしまう可能性があるようです。
だから、2つの質問:
- これはヘッダーの正しい使用法ですか?
- そうでない場合 (そして私はそうではないと思う)、ベストプラクティスは何ですか? クエリ文字列パラメータ?