代码之家  ›  专栏  ›  技术社区  ›  Nick

ASIFormDataRequest-文件的POST在身份验证失败后似乎继续

  •  0
  • Nick  · 技术社区  · 14 年前

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

    当身份验证失败并且调用了身份验证对话框委托时,上载过程似乎仍在完全进行。

    所以在这些情况下:

    1) 用户的凭据尚未存储在密钥链中 2) 存储在密钥链中的用户凭据验证失败(过期等)

    我看到这种行为:

    • 我看到我收到了请求 服务器和401拒绝错误
    • uploadFailed委托不存在 打电话。
    • 进度条代理慢慢填充为 在网络连接上。它 完全上载的时间量
    • 内置身份验证对话框 模态出现
    • 用户输入正确的凭据
    • 上传再次开始-进度条 在接收post数据时填充 服务器
    • 完成的委托方法称为
    • 第二次尝试

    我在这里设置我的操作:

    [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仍然会发出卡嗒卡嗒的声音,这是预期的行为吗?

    感谢对解决这一问题的现有问题的任何指导或指点。

    2 回复  |  直到 14 年前
        1
  •  0
  •   JosephH    14 年前

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

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

        2
  •  1
  •   Alex Reynolds    14 年前

    401“错误”是HTTP状态码,而不是请求失败。你的请求通过了,得到了一个响应,恰好是一个身份验证错误通知。你负责处理回复,不管是什么。

    There are many possible status codes 你可以从一个成功的请求中得到,而不是401。另外,您可能还需要考虑如何处理这些类型的响应,这取决于最终用户正在做什么以及哪些响应是合适的。

    方法 -uploadFinished: NSLog 完成请求的声明或其他通知。

    所以要做的一件事就是改变 -uploadFailed: -上载完成: 方法名到 -requestFailed: -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. 
            //
        }
    }