[英]ASIFormDataRequest- POST of file continues seems to continue after authentication fails
我正在使用ASIFormDataRequest將一些數據發布到經過HTTP身份驗證的url中。
當身份驗證失敗並且身份驗證對話框委托被調用時,上傳進度似乎仍將繼續進行。
因此,在這些情況下:
1)用戶憑證尚未存儲在鑰匙串中2)存儲在鑰匙鏈中的用戶憑證未通過身份驗證(已過期等)
我看到這種行為:
這是我設置操作的地方:
[self setRequest:[ASIFormDataRequest requestWithURL:uploadURL]];
[request setDelegate:self];
[request setDidFailSelector:@selector(uploadFailed:)];
[request setDidFinishSelector:@selector(uploadFinished:)];
[request setUseKeychainPersistence:TRUE];
[request setShouldPresentAuthenticationDialog:TRUE];
[request setShouldPresentCredentialsBeforeChallenge:TRUE];
[request setPostValue:captionTextField.text forKey:@"caption"];
[request setPostValue:[siteID stringValue] forKey:@"site_id"];
[request setFile:fileToUpload forKey:@"site_photo"];
[request setUploadProgressDelegate:progressView];
[request startAsynchronous];
我以為驗證失敗時需要發出[request cancel],但是我不確定應該在哪里進行。
是否在服務器返回401之后POST仍會掉電的預期行為?
感謝所有解決此問題的指南或指針。
401“錯誤”是HTTP狀態代碼,而不是請求失敗。 您的請求通過了,您得到了響應,它恰好是身份驗證錯誤通知。 您有責任處理響應,無論響應如何。
除了401之外,您還可以從成功的請求中獲得許多可能的狀態代碼 。順便說一句,您可能還想考慮如何處理這些類型的響應,這取決於最終用戶在做什么以及響應是什么。適當。
在您看到任何NSLog
語句或其他有關請求完成的通知之前, -uploadFinished:
方法通常不應等待數據完全上傳完畢。
因此,要做的一件事是將-uploadFailed:
和-uploadFinished:
方法名稱更改為-requestFailed:
和-requestFinished:
以更准確地反映應用程序邏輯中發生的事情。
在委托的-requestFinished:
方法中,檢查request
的responseStatusCode
屬性並發出適當的命令:
- (void) requestFinished:(ASIHTTPRequest *)request {
if ([request responseStatusCode] == 401) {
//
// cancel the current request and/or trigger a new,
// separate authentication request, passing along a
// reference to the request's body data, etc.
//
}
}
對於HTTP客戶端,這是相當常見的行為-它們在完全發送了請求(包括附件)之前,不會嘗試從服務器讀取答復。
如果客戶端已經有來自同一服務器的請求,並且在同一會話中被401拒絕,則搶先發送身份驗證是一種常見的行為-我不確定ASIHTTPRequest是否這樣做,但是如果這樣做,一種解決方案是在執行POST之前向服務器發出GET請求。 如果GET成功通過了身份驗證,則應為該帖子發送緩存的憑據,因此不會出現401錯誤。
我能想到的唯一其他選擇是,如果您控制服務器,則轉為使用基於cookie的身份驗證,或者在自定義http標頭中使用身份驗證。 但是我認為我建議先執行GET請求可能是最好的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.