如何通过NSURLConnection的连接使web服务传递错误:didFailWithError:?

Web服务需要做什么来使NSURLConnection's委托接收connection:didFailWithError: message?

例如:iOS应用程序将令牌传递给Web服务,Web服务查找令牌,然后Web服务需要以“无效令牌”或其他类似的错误进行响应。

目前,数据被接收,并在“ connectionDidFinishLoading :”分析错误消息。 这意味着我错误检查两个地方,我试图避免。

我的iOS应用程序和Web服务完全在我的控制之下。

根据我的经验(编程中最危险的三个词),仅当HTTP交换失败时才会调用-connection:didFailWithError: 这通常是一个networking错误,或者可能是一个身份validation错误(我不使用身份validation)。 如果HTTP消息成功,则不pipe响应代码如何,调用-connectionDidFinishLoading:

我的解决scheme:调用-connection:didFailWithError:当我检测到一个错误。 这样我所有的error handling代码都在一个地方。

在我的-connectionDidFinishLoading:顶部,我有:

 NSError *error; NSDictionary *result = [self parseResultWithData:self.connectionData error:&error]; if (!result) { [self connection:connection didFailWithError:error]; return; } 

NSUrlConnection的委托连接:didFailWithError有很多条件可以调用。这里列出了这些错误或常量 。我认为alertview会更好地显示连接中的http错误:didFailWithError :.

 -(void) connection:(NSURLConnection *)connection didFailWithError: (NSError *)error { UIAlertView *errorAlert= [[UIAlertView alloc] initWithTitle: [error localizedDescription] message: [error localizedFailureReason] delegate:nil cancelButtonTitle:@"Done" otherButtonTitles:nil]; [errorAlert show]; [errorAlert release]; NSLog (@"Connection Failed"); } 

虽然与您的问题没有直接关系,但我鼓励您转到更高层次的图书馆。 我可以衷心推荐AFNetworking,这是生产准备,我已经在很多项目中使用它。 这将允许您检查故障块中每个请求的响应代码。 这个项目也抽象了很多低级别的处理,否则你需要写networking通信; 我在这里讲解parsing和创buildXML / JSONstring来与服务进行通信。

为了给你一个更专注的回答你的问题,一旦你注意到connectionDidFinishLoading:一个错误,我会调用NSURLConnection的cancel方法。 这将自动取消请求并调用委托对象的失败方法。

NSURLConnection的文档非常干燥,委托的失败方法没有具体logging失败的情况。 您可以在URL加载系统编程指南中find更多信息。

我看不到那些树木。

我需要退出connection:didFailWithError:并看看不同的委托方法connection:didReceiveResponse: connection:didFailWithError:

在Web服务完全由我控制的情况下,端点可以响应一个500状态码,这个状态码可以connection:didReceiveResponse ,并传递一些JSON来进一步解释这个情况,它被connection:didReceiveData:起来处理connection:didReceiveData:

NSURLConnection委托在整个过程中挂起了几个状态,但是它具有迄今为止我发现的最好的代码气味。

杰弗里的答案是最正确的: connection:didFailWithError:callback只是相对于networking失败,从Web服务的任何响应意味着连接没有失败!