ASIHTTPRequest, кажется, всегда кэширует данные JSON - PullRequest
0 голосов
/ 12 февраля 2012

Я использую API ASIHTTPRequest для получения некоторых данных JSON с веб-сайта. Я использую асинхронный запрос без изменения свойств кэша по умолчанию. Код выглядит следующим образом:

__unsafe_unretained ASIHTTPRequest * request = [ASIHTTPRequest requestWithURL:url];

request.timeOutSeconds = 30;
[request setCompletionBlock:^(void)
 {
     NSString *str = [request responseString];
     /*
     *
     *
     */
 }];
[request setFailedBlock:^(void)
 {
     NSLog(@"status: %@",[request responseStatusMessage]);
     NSLog(@"%@ : %@",[request url],[[request error] debugDescription]);         
 }];
[request startAsynchronous];

Однако полученные данные JSON остаются прежними, хотя содержимое данных JSON на сервере изменяется.

Я проверил данные с помощью веб-браузера, как на ноутбуке, так и на iPhone Safari. Когда я запрашиваю URL после изменения в JSON, он сначала возвращает старые данные, но если я обновляю страницу, он возвращает обновленные данные. Но в приложении ASIHTTPRequest всегда возвращает старые данные.

Я также пытаюсь отладить код ASIHTTPRequest, чтобы увидеть, используются ли какие-либо кэшированные данные. Но похоже, что он никогда не использует кеш загрузки, потому что он не был установлен. Он никогда не входит в метод [useDataFromCache].

В чем может быть проблема? Как я могу заставить ASIHTTPRequest проверить, есть ли обновленные данные на сервере, и заставить его получить действительно обновленный JSON?

EDIT

Я использовал заголовок Cache-Control, и теперь я получаю правильные обновленные данные JSON. Код выглядит следующим образом:

[request addRequestHeader:@"Cache-Control" value:@"no-cache"];

Тем не менее, я думаю, что теперь запрос всегда будет пытаться получить JSON, даже если он не был изменен, что снизит производительность.

Как я могу сделать так, чтобы сначала проверил сервер, изменены ли данные, и получить, если они были изменены? В настоящее время я получаю данные JSON в виде динамического ответа от URL-адреса php, поэтому нет файла, который я мог бы проверить на актуальность данных.

Какое может быть решение?

С уважением,

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

Учитывая все, что вы сказали, кажется маловероятным, что ASIHTTPRequest кэширует ответ.

Итак, что-то еще должно быть - похоже, у вас есть кеширующий прокси-сервер между вами и сервером, и этопочему настройка Cache-Control имеет значение.

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

0 голосов
/ 12 февраля 2012

Согласно документации ASIHTTPRequest , вызов метода

[[ASIDownloadCache sharedCache] clearCachedResponsesForStoragePolicy:ASICachePermanentlyCacheStoragePolicy];

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

...