web-dev-qa-db-ja.com

ionic 3でHTTPリクエストとレスポンスのキャッシュを停止する方法

ネイティブhttpプラグインがキャッシュを保存したAPIリクエストとレスポンスのキャッシュと、アプリでの作成の問題を停止したいと思います。

オールタイムAPIは正常に機能しますが、サーバーから404または401エラーが発生すると、アプリにキャッシュされ、その後、ステータスが1のタイムアウトエラーが発生します。

この問題を解決するには、アプリをアンインストールして再インストールする必要がありますが、期待どおりに機能します。

HTTPリクエストとレスポンスのキャッシュを停止する方法はありますか?

または、1つのステータスでタイムアウトの問題を解決する方法は?

リクエストヘッダーで以下のことを試しましたが、それでも成功しません。

self.httpPlugin.setHeader('*', 'authorization', 'Bearer ' + token);
self.httpPlugin.setHeader('*', 'Cache-control', 'no-cache');
self.httpPlugin.setHeader('*', 'Cache-control', 'no-store');
self.httpPlugin.setHeader('*', 'Expires', '0');
self.httpPlugin.setHeader('*', 'Pragma', 'no-cache');

また、以下のようにAPI呼び出しの一意のリクエストを作成するために、リクエストにダミーの一意のパラメータを追加しました。

self.httpPlugin.setHeader('*', 'ExtraDate', new Date().toString());

Ionic 3でこの種の問題に直面している人はいますか?

試しました this スレッドの提案ですが、まったく運がありません。

この問題の解決策を提案してください。

**編集:**

完全なリクエストコード:

/**
   * Get Search result from server.
   */
getCaseListBySearchText(searchText: string): Observable<any> {
    let self = this;

  return Observable.create(function(observer) {
    self.getToken().then(token => {
      console.log("Token : ", token);

      // let Rand = Math.random();
      self.httpPlugin.setHeader("*", "authorization", "Bearer " + token);
      self.httpPlugin.setHeader("*", "Cache-control", "no-cache");
      self.httpPlugin.setHeader("*", "Cache-control", "no-store");
      // self.httpPlugin.setHeader("*", "Expires", "0");
      self.httpPlugin.setHeader("*", "Cache-control", "max-age=0");
      self.httpPlugin.setHeader("*", "Pragma", "no-cache");
      self.httpPlugin.setHeader("*", "ExtraDate", new Date().toString());

      self.httpPlugin
        .get(self.url + "/CaseList?caseNum=" + searchText, {}, {})
        .then(response => {
          console.log("Response Success : " + JSON.stringify(response));
          let jsonResponse = JSON.parse(response.data);
          console.log("JSON OBJECT RESPONSE : " + jsonResponse);
          observer.next(jsonResponse);
        })
        .catch(error => {
          if (error.status == 403) {
            console.log("Token expired : " + JSON.stringify(error));
            self.isTokenExpired = true;
            //Removing Old Token
            self.storage.remove(Constants.AUTH_DATA);
            observer.error(error);
          } else {
            console.log("Error : " + error);
            console.log("Error " + JSON.stringify(error));
            observer.error(error);
          }
        });
    })
    .catch(error => {
      console.log("Error : " + error);
      observer.error(error);
    });
});


}
9
CodeChanger

上記の問題に関する多くの研究開発とウェブ検索の後、何よりもヘッダーがキャッシュをクリーンアップするために機能しないため、リクエストキャッシュをクリーンアップする解決策を見つけました。

Http Advancedプラグインには、Cookieをクリアする方法が1つあります。

clearCookies()

すべてのCookieをクリアします。

クラスコンストラクターで上記のメソッドを使用して、APIを呼び出す前にCookieをクリアします。

したがって、すべてのCookieがクリアされ、古いCookieに関連する問題はこの方法で解決されます。

constructor(
    public storage: Storage,
    public httpPlugin: HTTP,
    private platform: Platform
  ) {
    // enable SSL pinning
    httpPlugin.setSSLCertMode("pinned");
    //Clear old cookies
    httpPlugin.clearCookies();
  }

上記のコードは私の問題を解決します。

迅速なガイダンスと提案をありがとうございました。

これが私の古いリクエストデータをクリアする正しい方法ではない場合は、これについてコメントしてください。

1
CodeChanger

応答ヘッダーを調べて、サーバーがキャッシュについてクライアントに何を通知するかを特定できます。 Cache-Control:max-age = 0を設定して、サーバーからの新しい応答を強制することもできます。

また、Expiresヘッダーを0に設定することは避けます。これは通常、サーバーによって設定され、「1 Jan 1970 00:00:00GMT」のような日付として定義されるためです。合計すると、これら3つのリクエストヘッダーは、キャッシュなしのメカニズムには十分なはずです。

  • プラグマ:キャッシュなし
  • キャッシュ制御:キャッシュなし
  • キャッシュ制御:max-age = 0

Httpキャッシングに関するほとんどの動作は、対応するRFCで説明されています。

https://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html

1
Burak Sarigul

通常、要求されたURLヘッダーに乱数を追加する場合。あなたはそれを達成することができます。

完全なブロックコードを私と共有してください私はあなたを助けるために最善を尽くします。

1
Khurram Shaikh