我正在使用ASIFormDataRequest将一些数据发布到http经过身份验证的网址。
当身份验证失败并且调用了身份验证对话框委托时,上载进度似乎仍然完全继续。
所以在这些情况下:
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];
我想我需要在验证失败时发出[请求取消],但我不确定我应该在哪里这样做。
即使在服务器返回401之后,POST是否仍会出现预期的行为?
感谢任何针对此问题的现有问题的指导或指示。
答案 0 :(得分:1)
401“错误”是HTTP状态代码,而不是请求失败。您的请求通过正常,您收到了响应,这恰好是一个身份验证错误通知。您负责处理响应,无论它是什么。
There are many possible status codes你可以从401以外的成功请求中获得。除此之外,您可能还想考虑如何处理这些类型的响应,具体取决于最终用户正在做什么以及什么回答是恰当的。
方法-uploadFinished:
通常不会等到数据完全上传后才能看到任何NSLog
语句或其他请求通知结束。
因此,要做的一件事是将-uploadFailed:
和-uploadFinished:
方法名称更改为-requestFailed:
和-requestFinished:
,以更准确地反映应用程序逻辑中发生的情况。
在您的委托的-requestFinished:
方法中,检查responseStatusCode
的{{1}}属性并发出相应的命令:
request
答案 1 :(得分:0)
这是HTTP客户端的相当常见的行为 - 在完全发送请求(包括附件)之前,他们不会尝试从服务器读取回复。
如果客户端已经有同一服务器的请求被同一会话中的401拒绝,那么客户端先发制人身份验证是常见的行为 - 我不确定ASIHTTPRequest是否执行此操作,但如果是解决方案是在执行POST之前向服务器发出GET请求。如果GET成功通过身份验证,那么应该为帖子发送缓存的凭据,因此不会出现401错误。
我能想到的唯一其他选择是转移到基于cookie的身份验证,如果您控制服务器,或在自定义http标头中使用身份验证。但我认为我首先提出GET请求的建议可能是最好的方法。