验证失败后,ASIFormDataRequest-文件POST继续似乎继续

时间:2010-08-11 23:00:42

标签: iphone asihttprequest

我正在使用ASIFormDataRequest将一些数据发布到http经过身份验证的网址。

当身份验证失败并且调用了身份验证对话框委托时,上载进度似乎仍然完全继续。

所以在这些情况下:

1)用户的凭证尚未存储在钥匙串中 2)存储在钥匙串中的用户凭证未通过认证(过期等)

我看到了这种行为:

  • 我看到请求进入我的 服务器和401拒绝错误 返回客户端
  • uploadFailed委托不是 调用。
  • 进度条代表慢慢填写为 该文件似乎仍然被推送 在网络连接上。它 在符合的时间内完成 完全上传的时间
  • 内置身份验证对话框 模态出现
  • 用户输入正确的凭据
  • 进度条委托重置
  • 再次上传 - 进度条 收到后填写的帖子数据 服务器
  • 完成的委托方法称为 预期。
  • 一切都上传得很好 第二次尝试

这是我设置操作的地方:

[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是否仍会出现预期的行为?

感谢任何针对此问题的现有问题的指导或指示。

2 个答案:

答案 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请求的建议可能是最好的方法。