2012-12-09 97 views
3

我使用AFNetworking從共享的「authenticator」類發出POST請求,該請求傳遞用戶的用戶名和密碼。這裏是我提出的POST請求:POST請求返回不需要的緩存結果(AFNetworking)

NSURL *url = [NSURL URLWithString:@"https://www..."]; 
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url]; 

// params 
NSDictionary* dict = @{@"loginName": username, 
@"password": password, 
@"serviceName": @"...", 
@"serviceURL": @"...", 
@"action": @"..."}; 

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
request = [httpClient requestWithMethod:@"POST" path:@"..." parameters:dict]; 
request.cachePolicy = NSURLRequestReloadIgnoringCacheData; 
request.timeoutInterval = 30.0; 

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"%@", operation.responseString); 
} 
           failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
            NSLog(@"login failed"); 
           }]; 

[operation start]; 

它對第一次登錄很有效,一切都按預期返回。當我嘗試以不同的用戶名/密碼登錄時,我看到operation.responseString的輸出與第一次登錄的輸出完全相同。

有誰知道它爲什麼從第一次登錄返回輸出?我覺得這個反應是緩存的響應,我已經添加了以下嘗試,以防止緩存返回信息:

request.cachePolicy = NSURLRequestReloadIgnoringCacheData; 

我已經設置斷點地看到,這些參數在NSDictionary的用戶名和密碼新的用戶名/密碼組合。

字符串文字在任何POST請求中也不會被操縱。 elipses是隱私的,並且是具有語義含義的字符串的佔位符。

回答

4

嘗試,而不是

request.cachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData; 

因爲NSURLRequestReloadIgnoringCacheData唯一忽略本地緩存數據,而不是緩存在網絡上。

編輯:正如Steve Madsen在下面指出的那樣,這不是真正的問題,一般來說,對POST請求的響應在任何情況下都不會被緩存。實際的問題是,程序沒有在兩次登錄之間註銷,這是錯誤的。但我們確實修復了它!

+0

我還是找回了相同的結果。這看起來非常有希望,但我仍然困惑,爲什麼它不能解決我的問題! –

+0

您不會顯示設置字典的詳細信息。你確定字典在兩次調用之間已經正確更新嗎?在進行POST之前,「NSLog」字典? – emrys57

+0

第二個想法:你顯示的完成塊有「成功」,這意味着登錄是好的,「失敗」意味着登錄失敗。但是,這當然不是成功和失敗的意義。 「成功」只是從服務器獲得明智的答覆。例如,「失敗」將是DNS查找失敗或超時。 ???? – emrys57

-1

嘗試一下 [request setHTTPShouldHandleCookies:NO];