使用 AFNetworking 缓存不需要的 GET 请求

Posted

技术标签:

【中文标题】使用 AFNetworking 缓存不需要的 GET 请求【英文标题】:Unwanted caching a GET request with AFNetworking 【发布时间】:2015-07-14 06:19:29 【问题描述】:

我这里有一个情况,我使用带有 AFNetworking 的 rest API 从我们的后端检索特定资源(GET 请求)。当我使用浏览器检查后端时,结果为 165,但在一台特定设备(一台特定的 iPhone 6 plus)中,结果为 5,在任何其他设备中,我检索到 165 的正确答案。我认为某些东西在此设备上缓存了结果,但在此特定设备上没有发现任何内容。

我删除了该应用程序并再次安装它,它再次出现错误,所以NSURLCache 也不是问题

我用来从后端检索数据的代码,它适用于任何其他设备,但不适用于该特定设备。 (顺便说一句,我使用相同的用户名和密码来检查所有设备和浏览器)所以情况并非如此。

AFHTTPRequestOperationManager* manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];

[manager.requestSerializer setValue:[[NSUserDefaults standardUserDefaults] valueForKey:TOKEN_ID_KEY] forHTTPHeaderField:TOKEN_HTTP_HEADER_NAME];
[manager GET:[NSString stringWithFormat:@"%@%@", BASE_URL, PROFILE_URL] parameters:nil success:^(AFHTTPRequestOperation* operation, id responseObject) 
    NSLog(@"profile info request accepted with response : %@",responseObject);
    profile = [[Profile alloc] initWithDictionary:responseObject];
    [self.tableView reloadData];
 failure:^(AFHTTPRequestOperation* operation, NSError* error) 
    NSLog(@"profile info request failed with eroor : %@" , [error localizedDescription]) ;
];

【问题讨论】:

你能把你发送请求和处理响应的代码贴出来吗? 关于不缓存请求 - AFNetworking 正在使用共享的NSURLCache,您可以按照此答案为您的应用取消缓存:***.com/a/17063060/2242359 @AvielGross 我添加了代码,我不认为我的代码有问题,因为它可以在任何其他设备和浏览器上运行,它不仅仅在这个特定设备上运行 @AvielGross 我删除了应用程序并重新安装了它,它再次出现错误,所以这也不是问题 尝试在你的 iPhone 上使用Charles Proxy 在坏设备和另一台设备上,看看请求是否有所不同:charlesproxy.com/documentation/faqs/… 【参考方案1】:

如果您找不到解决问题的方法,则可以在网址末尾添加当前时间。它也发生在我身上,我只是在我的 url 中添加了一些额外的东西,所以它总是一个新的请求。

long currentTime = (long)CFAbsoluteTimeGetCurrent();
NSString *urlString = [NSString stringWithFormat:@"%@%@?%ld", 
                                                BASE_URL, 
                                                PROFILE_URL, 
                                                currentTime];

这只是一种解决方法。希望这会有所帮助

【讨论】:

【参考方案2】:

最简单的方法是禁用全局NSURLCache,尽管我不建议这样做。

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0
                                                        diskCapacity:0
                                                            diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];

【讨论】:

首先我不能禁用缓存,因为我们在这个应用程序上使用了地图,所以如果我禁用它,瓷砖不会被缓存,其次我删除了应用程序并再次安装它并且请求不是再次工作。所以这对我没有帮助

以上是关于使用 AFNetworking 缓存不需要的 GET 请求的主要内容,如果未能解决你的问题,请参考以下文章

如何知道请求是不是来自缓存或不使用 AFNetworking

缓存策略,AFNetworking

AFNetworking:如何知道响应是不是使用缓存? 304 或 200

iOS - 使用 AFNetworking 获取图像保持缓存

如何从 AFNetworking 禁用缓存

对磁盘的 afnetworking 缓存请求