【问题标题】:POST Request returning unwanted cached results (AFNetworking)POST 请求返回不需要的缓存结果 (AFNetworking)
【发布时间】:2012-11-26 21:17:03
【问题描述】:

我正在使用AFNetworking 从一个共享的“身份验证器”类发出 POST 请求,该类传入用户的用户名和密码。这是我发出的 POST 请求:

 NSURL *url = [NSURL URLWithString:@"https://www..."];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];

// params
NSDictionary* dict = @{@"loginName": username,
@"password": password,
@"serviceName": @"...",
@"serviceURL": @"...",
@"action": @"..."};

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
request = [httpClient requestWithMethod:@"POST" path:@"..." parameters:dict];
request.cachePolicy = NSURLRequestReloadIgnoringCacheData;
request.timeoutInterval = 30.0;

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"%@", operation.responseString);
}
                                 failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                                     NSLog(@"login failed");
                                 }];

[operation start];

第一次登录时效果很好,一切都按预期返回。当我尝试使用不同的用户名/密码登录时,我看到operation.responseString 的输出与第一次登录的输出完全相同。

有谁知道为什么它会返回第一次登录的输出?感觉响应是缓存响应,为了防止缓存信息返回,我加了如下内容:

request.cachePolicy = NSURLRequestReloadIgnoringCacheData;

我已经设置断点查看NSDictionary中的用户名和密码为参数是新的用户名/密码组合。

字符串文字无论如何也不会被操纵,并且在每个 POST 请求中都是相同的。省略号用于保护隐私,是具有语义含义的字符串的占位符。

【问题讨论】:

    标签: ios caching post afnetworking


    【解决方案1】:

    试试吧

    request.cachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;
    

    因为NSURLRequestReloadIgnoringCacheData 只会忽略本地缓存数据,不会缓存到网络上。

    编辑:正如史蒂夫·马德森(Steve Madsen)在下面指出的那样,这不是真正的问题,而且,一般来说,对 POST 请求的响应在任何情况下都不会被缓存。实际的问题是程序没有在两次登录之间错误地注销。但我们最终还是修复了它!

    【讨论】:

    • 我仍然得到相同的结果。这看起来很有希望,但我仍然对为什么它没有解决我的问题感到困惑!
    • 您没有显示设置字典的详细信息。您确定字典已在两次调用之间正确更新吗? NSLog 发布 POST 之前的字典?
    • 再想一想:您显示的完成块有“成功”表示登录正常,“失败”表示登录失败。但这肯定不是这里的成功和失败的意思。 “成功”只是从服务器得到一个明智的答复。例如,“失败”是 DNS 查找失败或超时。 ??????
    • 我在字典的参数设置后添加了NSLog,它会打印出新的用户名和新密码。 NSLog(@" %@", [dict objectForKey:@"loginName"]); NSLog(@" %@", [dict objectForKey:@"password"]); 你说得对,NSLog(@"login failed"); 在这种情况下没有正确的语义,但在这个问题中,它是不相关的。成功完成块总是被执行,只是带有一个 operation.responseString ,它具有第一次登录的响应
    • 你真的在这两次服务器调用之间注销了吗?
    【解决方案2】:

    我也有同样的问题,终于解决了。使用方法:

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

    来自这篇博文:How Does Caching Work in AFNetworking? : AFImageCache & NSUrlCache Explained

    【讨论】:

      【解决方案3】:

      试试看 [请求设置HTTPShouldHandleCookies:NO];

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-21
        • 2017-06-09
        • 1970-01-01
        • 2022-09-24
        • 2023-04-07
        • 1970-01-01
        • 2019-09-09
        相关资源
        最近更新 更多