0

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

当身份验证失败并调用身份验证对话框委托时,上传进度似乎仍在完全进行。

所以在这些情况下:

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

我看到这种行为:

  • 我看到请求进入我的服务器,并且 401 denied 错误返回给客户端
  • 不调用 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 仍然会消失,这是预期的行为吗?

感谢任何指导或指向解决此问题的现有问题。

4

2 回答 2

1

401“错误”是 HTTP 状态代码,而不是请求失败。您的请求顺利通过,并且您收到了响应,这恰好是身份验证错误通知。您负责处理响应,无论它可能是什么。

除了 401 之外,您可以从成功的请求中获得许多可能的状态代码。顺便说一句,您可能还想考虑如何处理这些类型的响应,具体取决于最终用户在做什么以及响应是什么合适的。

该方法-uploadFinished:通常不应等到数据完全上传后才能看到NSLog请求完成的任何语句或其他通知。

所以要做的一件事是更改-uploadFailed:-uploadFinished:方法名称以-requestFailed:-requestFinished:准确地反映应用程序逻辑中正在发生的事情。

在您的委托-requestFinished:方法中,检查 的responseStatusCode属性request并发出适当的命令:

- (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. 
        //
    }
}
于 2010-08-11T23:32:28.407 回答
0

这对于 HTTP 客户端来说是相当常见的行为——它们在完全发送请求(包括附加文件)之前不会尝试从服务器读取回复。

如果客户端已经有来自同一服务器的请求在同一会话中被 401 拒绝,则客户端先发制人地发送身份验证是一种常见的行为 - 我不确定 ASIHTTPRequest 是否这样做,但如果这样做的话,一种解决方案是在执行 POST 之前向服务器发出 GET 请求。如果 GET 成功通过身份验证,则应为帖子发送缓存的凭据,因此不会出现 401 错误。

如果您可以控制服务器,或者在自定义 http 标头中使用身份验证,我能想到的唯一其他选择是改用基于 cookie 的身份验证。但我认为我建议先执行 GET 请求可能是最好的方法。

于 2010-08-12T11:41:40.183 回答