2012-08-01 75 views
0

所以對於我的一位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的錯誤。

這似乎應該有一個可笑的簡單的解決方案,但我沒有看到它。謝謝你的幫助。

回答

1

根據規範,我不相信一個HTTP服務器發回一個HTTP響應,直到HTTP請求被完全接收。這意味着即使你發送了一堆數據到任何地方,你所看到的行爲也是可以預料的。

您可以嘗試發送請求中的HTTP Expect Header。否則,你有沒有考慮發出一個初步的ping請求來檢查url端點是否存在?也許沒有數據的POST?然後,在做出昂貴的請求之前,您可以瞭解有關404的信息。

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"); 
       } 
     ... 

     ... 
} 
+0

是的,我已經實現了didReceiveResponse - 這就是問題所在。 didReceiveResponse確實是用正確的404代碼調用的,但是直到* didSendBodyData被調用超過bazillion次之後,因爲它似乎將一個30MB文件上傳到任何地方。 因此,在啓動上傳20秒後,以及看起來一切正常後,我能夠看到它是一個404.我需要馬上看到,就像你期望的那樣... – 2012-08-01 21:38:42

+0

你爲什麼不做首先沒有數據的請求 - 檢查來自服務器的有效響應代碼。因爲在得到回覆之前,你總是會嘗試發送BodyData。 – AppHandwerker 2012-08-02 06:59:11