AFHTTPSessionManager POST 请求执行成功但调用失败块

Posted

技术标签:

【中文标题】AFHTTPSessionManager POST 请求执行成功但调用失败块【英文标题】:AFHTTPSessionManager POST request executes successfully but calls failure block 【发布时间】:2015-05-10 07:15:11 【问题描述】:

有时使用 AFHTTPSessionManager 的 POST 请求会执行失败块,并出现以下错误:网络连接丢失。但是服务器端代码成功执行,发送 200 OK 响应。这怎么可能,该怎么办?如果在服务器执行例程(成功)时网络连接丢失,一般来说什么是好的策略? AFNetworkReachabilityManager 可能有问题吗?我在 AppDelegate 中这样设置:

// Monitor network connection
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) 
switch (status) 
  case AFNetworkReachabilityStatusReachableViaWWAN:
  case AFNetworkReachabilityStatusReachableViaWiFi:
    DDLogInfo(@"AFNetworkReachabilityStatusReachableViaWiFi:");

    // Resume callbacks for remote operations
    [[[TSHTTPSessionManager sharedManager] operationQueue] setSuspended:NO];

    // Notify app
    [[NSNotificationCenter defaultCenter] postNotificationName:TSDidConnectToNetworkNotification
                                                        object:self userInfo:nil];
    break;
  case AFNetworkReachabilityStatusNotReachable:
    DDLogInfo(@"AFNetworkReachabilityStatusNotReachable:");

    // Suspend callbacks for remote operations
    [[[TSHTTPSessionManager sharedManager] operationQueue] setSuspended:YES];

    // Notify app
    [[NSNotificationCenter defaultCenter] postNotificationName:TSDidDisconnectFromNetworkNotification
                                                        object:self userInfo:nil];
    break;
  default:
    break;

];

编辑:我想我没有说清楚:问题不在于 AFNetworkReachabilityManager(我只是添加了代码以显示应用程序如何检测连接问题并将它们作为通知转发,以便应用程序的其他部分在它们得到通知时得到通知决定这样做)。问题是关于成功传输到服务器的请求(POST),导致服务器端代码执行。同时,在服务器能够发送其响应之前,连接丢失,这反过来导致客户端故障块执行(在网络再次可访问但我猜这并没有真正产生影响) .我如何在客户端知道服务器仍然成功?

【问题讨论】:

刚刚发现这个问题可能与:***.com/questions/26806850/… 【参考方案1】:

如果设备失去连接,AFNetworking 的底层AFHTTPRequestOperationNSURLSessionDataTask 对象将立即失败。暂停operationQueue 所做的只是阻止您设置的完成块运行,因此在连接重新联机并且operationQueue 恢复之前,您不会听到失败的消息。

一般来说,在处理连接问题时,最简单的方法就是像处理任何其他故障一样处理它。可能会向用户显示一条错误消息,让他们知道他们的连接已脱机,并在连接恢复时再次尝试他们的请求。如果你真的,真的需要,你可以围绕各种 AFNetworking 调用构建一个方便的包装器,尝试在失败或连接丢失时重试它们,但这似乎是很多工作却没有什么好处,因为你不知道连接何时会恢复。据你所知,用户已经离开你的应用程序,它在后台被杀死。但是您目前的方法肯定不是正确的方法。

【讨论】:

嗯,但这并不能回答我的问题,即关于在服务器端成功执行的 POST 请求,然后,在服务器可以发送响应之前,网络连接丢失。尽管执行了我的失败块,但我如何在客户端知道服务器成功? 实际上,它确实回答了您关于为什么从未收到 200 响应的原始请求。但是至于如何知道 200 响应:您不知道,直到客户端能够从服务器接收到该事实。如果在此之前连接丢失,则没有标准机制可以实现您想要的。当然,如果您可以控制后端,可能有几种方法可以完成您想要的,但真正的问题是这是否值得。

以上是关于AFHTTPSessionManager POST 请求执行成功但调用失败块的主要内容,如果未能解决你的问题,请参考以下文章

AFHTTPSessionManager 便捷方法(GET、POST、PUT 等)和后台传输

AFHTTPSessionManager POST 请求执行成功但调用失败块

如何在使用 AFHTTPSessionManager 发送 POST 请求时向参数发送空白数据

如何使用 AFHTTPSessionManager 访问 422 上的响应正文?

快速使用 AFHTTPSessionManager

如何使用 AFNetworking 查看 json POST 的错误?