的iOS NSURLConnection的POST错误处理

问题描述:

所以对于我的一位iOS用户端,我发起POST上传数据(比如30MB)的一大块,通过:的iOS NSURLConnection的POST错误处理

[[NSURLConnection connectionWithRequest:req delegate:self] retain]; 

不过,我需要处理URL不好的情况 - 比如说返回404的情况。问题是,我的didSendBodyData委托方法被重复调用,就像应该假设URL是正确的一样,直到32K的数据块为止,直到它达到了30MB的文件总大小。我实际上是用这种方法进行计算来显示和显示一个进度条,即使有一个无效的URL,它看起来就像是在传输整个文件(我不确定在封面下面发生了什么 - 它可以实际上什么都做不了,URL解析成404!)

那么,假设上传20秒后,我的didReceiveResponse委托方法终于被调用了,在那里我可以检查NSURLResponse并看到404被提供了。为什么在我能够得到任何类型的错误之前它似乎传输整个文件?使用​​,我怎么能知道这是404之前它实际上做任何事情?无论如何要告诉didSendBodyData方法,或任何其他方式来告诉我所看到的?

一个更大的问题是,我让你限制上传时间,所以它在x秒后停止,此时我取消连接(在didSendBodyData方法的中间),这样做似乎没有知道任何事情的方式甚至出现了URL的错误。

这似乎应该有一个可笑的简单的解决方案,但我没有看到它。谢谢你的帮助。

根据规范,我不相信一个HTTP服务器发回一个HTTP响应,直到HTTP请求被完全接收。这意味着即使你发送了一堆数据到任何地方,你所看到的行为也是可以预料的。

您可以尝试发送请求中的HTTP Expect Header。否则,你有没有考虑发出一个初步的ping请求来检查url端点是否存在?也许没有数据的POST?然后,在做出昂贵的请求之前,您可以了解有关404的信息。

您是否实施了NSURLConnectionDataDelegate

如下面的委托方法可能是你追求的:

- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response; 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; 

,如果你只是想检查响应代码,并执行一些动作,那么我会添加以下代码

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
      NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; 
       if (httpResponse.statusCode == 404){ 
        NSLog(@"Epic Fail"); 
       } 
     ... 

     ... 
} 
+0

是的,我已经实现了didReceiveResponse - 这就是问题所在。 didReceiveResponse确实是用正确的404代码调用的,但是直到* didSendBodyData被调用超过bazillion次之后,因为它似乎将一个30MB文件上传到任何地方。 因此,在启动上传20秒后,以及看起来一切正常后,我能够看到它是一个404.我需要马上看到,就像你期望的那样... – 2012-08-01 21:38:42

+0

你为什么不做首先没有数据的请求 - 检查来自服务器的有效响应代码。因为在得到回复之前,你总是会尝试发送BodyData。 – AppHandwerker 2012-08-02 06:59:11