使用 AFNetworking 不需要缓存 GET 请求
Unwanted caching a GET request with AFNetworking
我这里有一个情况,我使用 rest API 和 AFNetworking 从我们的后端检索特定资源(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]) ;
}];
最简单的方法就是禁用全局 NSURLCache
,尽管我建议不要这样做。
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0
diskCapacity:0
diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
如果您找不到任何可以解决您的问题的方法,那么您可以在 url 的末尾添加当前时间。它也发生在我身上,我只是在我的 url 中添加了一些额外的东西,所以它总是一个新的请求。
long currentTime = (long)CFAbsoluteTimeGetCurrent();
NSString *urlString = [NSString stringWithFormat:@"%@%@?%ld",
BASE_URL,
PROFILE_URL,
currentTime];
这只是一种解决方法。希望这有帮助
我这里有一个情况,我使用 rest API 和 AFNetworking 从我们的后端检索特定资源(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]) ;
}];
最简单的方法就是禁用全局 NSURLCache
,尽管我建议不要这样做。
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0
diskCapacity:0
diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
如果您找不到任何可以解决您的问题的方法,那么您可以在 url 的末尾添加当前时间。它也发生在我身上,我只是在我的 url 中添加了一些额外的东西,所以它总是一个新的请求。
long currentTime = (long)CFAbsoluteTimeGetCurrent();
NSString *urlString = [NSString stringWithFormat:@"%@%@?%ld",
BASE_URL,
PROFILE_URL,
currentTime];
这只是一种解决方法。希望这有帮助