2017-10-23 15 views
0

私はアンドロイドアプリケーションのAPIを使って作業しています。彼らは、ヘッダが古い応答がまだ有効であると言うならば、応答を取り戻すことを避けるライブラリ(高速アンドロイドネットワーキング)を実装しています。アプリケーションの応答キャッシュを管理するためのノードjsライブラリ

私の側で、応答が変更されたかどうかを検出できるロジックを実装しようとしています。 アプリケーションが最後にリクエストを行ってから応答が変更された場合は、ローカル応答が無効であることをアプリに知らせるために適切なヘッダを設定します。さもなければヘッダーはアプリケーションが彼らのローカル応答が安全に使用できることを知らせるでしょう。

アプリケーションはマルチメディアコンテンツを管理します。ユーザーは自分のコンテンツを追加し、 のコンテンツを共有し、コンテンツを購読します。その結果、アプリケーションの応答はユーザーに大きく依存します。

これを考慮して、私は応答をキャッシュしません。私がしたいのは、ローカルに保存されているレスポンスを更新する必要があるときにアプリケーションに伝えることができることです。

私たちはこれまでこれを行うメカニズムを持っていました。私は、ユーザーがapiのそれぞれについてリクエストをしていたときに、最新の時刻を保存して更新していました。その後、特定のデータセットが最後に変更されたことを示す値を更新していました(たとえば、曲のリストが変更された場合、またはユーザーの情報が変更された場合)。このようにして、アプリケーションがローカルレスポンスを置き換える必要があるかどうかを理解できました(一般的に)。

しかし、それは多くの手作業であり、おそらくそれをより効率的に処理できるライブラリがあります。私は検索してきましたが、私が見つけたものはすべて、応答がユーザーごとに変化するという事実を考慮していません。

バックエンドはノードjsにあります。

+0

[ETag](https:// ja)がありますか?wikipedia.org/wiki/HTTP_ETag)が有効になっていますか? –

+0

現在はありません。私はそれを可能にすることができた。 –

+0

@BrahmaDev [OK]を読んだ後、私はそれを得た。 Etagは、この「ハッシュ」または検証トークンを生成します。このトークンを使用して、応答が変更されたかどうかを比較できます –

答えて

0

私の解決策は、etags(Brahma Devの提案)を使用していました。私はモジュール暗号を使用して、ハッシュアルゴリズムとしてetag、sha256を生成しました。バックエンド側では、ロジックは次のようになります。

var crypto = require('crypto'); //include crypto 
var evaluation_tag = crypto.createHash('sha256').update(JSON.stringify(result)).digest('hex'); //generate etag on api response 
var client_etag = (!req.header('clientsETag')) ? "" : req.header('clientsETag'); //the application I am working with could not send the etag in any other manner 
var status_code = (evaluation_tag!==client_etag) ? status : 304; // if the response data is different from the one in the application cache, send status different that 304 
var response_data = (evaluation_tag!==client_etag) ? result : []; // if response has not changed, don't resend it to spare bandwidth and run time in both sides (client and server) 

res.setHeader('etag', evaluation_tag);//send etag of new response 
res.send(clear_response); //send response 

アプリケーションは応答を受け取ります。 status_codeが304の場合、残りの応答は無視されます。それ以外の場合は、このAPI用に格納されているetagとキャッシュ内のデータを更新します。キャッシュにエタグとデータがない場合、アプリケーションはエタグをまったく送信しません。

次の要求では、アプリケーションはそのキャッシュにetagを送信します。サーバーは新しい応答のエタグを計算します。アプリケーション上のものと同じ場合は、応答も同じであることを意味します。 304がステータスコードとして送信され、データはアプリケーションに返送されません。エタグが変更された場合は、データも変更されます。新しいデータとともに、別のステータスコード(ほとんど200、...ロジックに依存する)が送信されます。

Expressは、デフォルトでetagsを生成して送信します。あなたはここでもっと読むことができます。我々は2つの理由のために私たち自身の上のetagsを生成することにしました:

  1. 我々が使用する(MD5とCRC32)を発現するハッシュアルゴリズムを使用したくなかった
  2. Expressが応答全体のハッシュを計算します。アプリケーションの実際のデータを表すものではありませんが、すべての応答で変化する可能性がある応答の一部があります。つまり、アプリケーションデータが変更されていなくても、毎回同じエタグが発生していました。
関連する問題