0

因此,对于我的 iOS 客户端,我正在启动 POST 以通过以下方式上传大量数据(例如 30MB):

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

但是,我需要处理 URL 错误的情况 - 例如,返回 404 的情况。问题是,我的didSendBodyData委托方法被一遍又一遍地调用,就像它应该假设 URL 是正确的一样,以 32k 为单位价值的数据,直到达到 30MB 的总文件大小。我实际上是在用这种方法进行计算以显示和显示进度条,即使 URL 无效,它的外观和行为也像是在传输整个文件(我不确定幕后到底发生了什么 - 它可以'实际上没有做任何事情,URL 解析为 404!)

然后,在假定上传 20 秒后,我的didReceiveResponse委托方法最终被调用,我可以在其中检查 NSURLResponse 并查看是否提供了 404。为什么它似乎在我能够得到任何类型的错误之前传输了整个文件?使用[NSURLConnection connectionWithRequest],我怎么能在它实际做任何事情之前知道这是一个 404 ?无论如何,有什么didSendBodyData方法可以告诉,或者有什么其他方式可以比我看到的更早告诉吗?

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

看起来这应该有一个非常简单的解决方案,但我没有看到它。谢谢你的帮助。

4

2 回答 2

1

根据规范,我不相信 HTTP 服务器在完全接收到 HTTP 请求之前会发回 HTTP 响应。这意味着即使您将一堆数据发送到任何地方,您看到的行为也是预期的。

您可以尝试在请求中发送HTTP Expect 标头。否则,您是否考虑过发送初步 ping 请求以检查 url 端点是否存在?也许是没有数据的 POST?然后,您可以在提出昂贵的请求之前了解 404。

于 2012-08-02T01:57:52.670 回答
0

你实现了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");
                }
        ...

        ...
}
于 2012-08-01T19:53:09.203 回答