2011-08-11 249 views
0

在我的應用程序中,我有一個按鈕,它調用了ASIHTTPRequest。請求正常,我收到一個響應字符串。但是當請求結束時,它總是進入方法:requestFinished。我也有一個requestFailed方法。但即使當我給錯誤的鏈接,請求finsihes並永遠不會失敗..爲什麼這是?這是我的代碼:ASIHTTPRequest如何識別完成的請求和失敗的請求?

-(void)fetchForm:(id)sender { 

    NSURL *URL=[NSURL URLWithString:@"http://www.mydomain.nl/testGet.php"]; 
    ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:URL] autorelease]; 
    [request setDelegate:self]; 
    [request setDidFailSelector:@selector(requestFailed:)]; 
    [request startAsynchronous]; 

} 

-(void)requestFinished:(ASIHTTPRequest *)request { 
    NSLog(@"Request Success!"); 
} 

-(void)requestFailed:(ASIHTTPRequest *)request { 
    NSLog(@"Request Failed!"); 
} 

編輯:

我讀了ASIHTTPRequest網站上的一個小文件。我得出的結論是,如果有錯誤代碼,我需要親自查看。我這樣做有:

int statusCode = [request responseStatusCode]; 

if (statusCode == 404) { 
NSLog(@"Statuscode 404 has occured!"); 
} 

回答

4

有幾種情況可能會影響HTTP請求的錯誤報告。從ASIHTTP的角度來看,如果請求對象可以成功構建,發送,並且收到某種響應,那麼一切都可以。

就我而言,例如,我的ISP有一個代理服務器,它將返回一個包含許多不存在URL的錯誤頁面,有時甚至包含格式不正確的URL。在這種情況下,ASIHTTP不會失敗。我不知道這是不是你的情況,但它是爲我。

如果您查看文件ASIHTTPRequest.m並搜索failWithError,您將看到ASIHTTP將觸發導致被調用的機制的所有情況。你甚至可以在failWithError方法中設置一個斷點來查看它是否被調用。

編輯:

在某種意義上ASIHTTPRequest機制是非常基本的,並在網絡級別覆蓋故障。如果您收到回覆,那麼這是一個應用程序級別的失敗,您必須處理它。

第一件事就是檢查HTTP狀態代碼:

int statusCode = [request responseStatusCode]; 
NSString *statusMessage = [request responseStatusMessage]; 

這將讓您識別404,500,等等。

如果這不起作用,並且服務器不發送錯誤代碼,那麼解決它的唯一方法是解析您收到的響應,並且如果它不包含您正在等待的數據,則失敗。

+0

就我而言,它是一樣的。請求可以被做出,但是響應是某種錯誤字符串。但由於返回的錯誤字符串,ASIHTTPRequest一切正常,因爲返回的東西。我如何改變這一點? –

+0

錯誤字符串從哪裏來?它的內容是什麼? – sergio

+0

這只是一個404錯誤,如果我在瀏覽器中調用網址。它來自一個PHP頁面。 –

0

嘗試這一個 -

[request setDidFailSelector:@selector(requestFailed:)]; 
+0

正如你在上面的代碼中看到的,我已經知道了。 –

+0

嗨@傑克我遇到了同樣的問題,但我的問題解決了,當我使用ASINetworkQueue,我不知道爲什麼它的作品,但它做到了。 – saadnib

0

試試這個: -

[request setDidFinishSelector:@selector(requestFinished:)]; 
[request setDidFailSelector:@selector(requestFailed:)]; 

寫這兩條線,然後嘗試。