Как перестать кэшировать мой HTTP-запрос и ответ в ionic 3 - PullRequest
0 голосов
/ 08 октября 2018

Я хочу прекратить кэширование моего запроса и ответа API, который плагин native-http сохранил в своем кэше и создает проблему с моим приложением.

Постоянный 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());

Любой, кто сталкивался с такой проблемой в Ionic3?

Попробовал эту ветку предложений, но совсем не повезло.

Предложите какое-либо решение для этой проблемы.

** Редактировать: **

Полный код запроса:

/**
   * 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);
    });
});


}

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Обычно, если вы добавляете случайное число в запрошенный заголовок URL.Вы можете достичь этого.

Поделитесь полным кодом блока со мной, я сделаю все возможное, чтобы помочь вам.

0 голосов
/ 19 октября 2018

После большого количества исследований и веб-поиска по вышеупомянутой проблеме я нашел решение для очистки моего кеша запросов, так как прежде всего заголовок не работает для очистки кеша.

В плагине http Advanced есть один способ очистить мои куки.

clearCookies()

Очистить все куки.

Используя вышеописанный метод в конструкторе моего класса, очистить куки перед вызовом любого API.

Так что все, что он сделает, очистит все мои файлы cookie, и моя проблема, связанная со старыми файлами cookie, будет решена таким образом.

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

Приведенный выше код решит мою проблему.

Спасибо всем за вашекраткое руководство и предложения.

прокомментируйте это, если это не правильный способ очистить мои старые данные запроса.

0 голосов
/ 16 октября 2018

Вы могли бы взглянуть на заголовки ответа, чтобы определить, что сервер сообщает вашему клиенту о кэшировании.Вы также можете попытаться форсировать новый ответ от сервера, установив Cache-Control: max-age = 0.

Кроме того, я бы не стал устанавливать заголовок Expires равным 0, так как это обычно устанавливается серверами и определяется какдата как "1 января 1970 00:00:00 по Гринвичу".Всего этих трех заголовков запросов должно быть достаточно для механизма без кэширования.

  • прагма: без кэширования
  • контроль кэша: без кэширования
  • контроль кеша: max-age = 0

Большинство поведений о http-кэшировании объясняется в соответствующем RFC:

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

...