【问题标题】:How to cancel ASIHTTPRequest with wrong response HTTP code?如何使用错误的响应 HTTP 代码取消 ASIHTTPRequest?
【发布时间】:2025-12-28 02:40:06
【问题描述】:

我正在为 HTTP 请求使用 ASIHTTPRequest 并将结果保存到单独的文件中。由于文件预计很大,它也应该能够恢复。

request.allowResumeForFileDownloads = YES;
request.downloadDestinationPath = destFile;
request.temporaryFileDownloadPath = tmpFile;

我使用以下选择器:

request.didFinishSelector = @selector(didFinishRequest:);
request.didFailSelector = @selector(didFailRequest:);
request.didReceiveResponseHeadersSelector = @selector(didReceiveResponse:);

现在我正在测试不同的情况,包括失去连接、不同的代理等,并发现了一个问题,如果收到带有 503 或其他代码的响应,那么 ASIHTTPRequest 仍然将结果保存到临时文件中,这是错误的,因为数据是一些有错误的随机 HTML 页面(如果有部分下载的文件,那么这个 HTML 会附加到它上面,这会使我的数据损坏)。

所以我要做的是检查响应代码,如果不是 2XX,则取消请求而不保存任何内容。

这没有帮助:

- (void)didReceiveResponse:(ASIHTTPRequest*)request {
    if (request.responseStatusCode < 200 || request.responseStatusCode >= 300) {
        [request clearDelegatesAndCancel];

有什么想法吗?

【问题讨论】:

  • 当您尝试发布的代码时会发生什么?您是否尝试过进入 [request clearDelegatesAndCancel] 以找出为什么它没有停止下载?

标签: iphone http asihttprequest


【解决方案1】:

目前还没有找到干净的解决方案,所以有一点hack:

在 ASIHTTPRequest.m 方法 readResponseHeaders 的最后一行中,我们需要更改为 waitUntilDone:YES(第 2281 行),因此代码不会继续运行和处理数据。

    [self performSelectorOnMainThread:@selector(requestReceivedResponseHeaders:) withObject:[[[self responseHeaders] copy] autorelease] waitUntilDone:YES];

不幸的是,在 didReceiveResponse: 选择器中我们不能简单地调用 clearDelegatesAndCancel 方法,因为它只会挂起线程,因为 ASIHTTPRequest 中的锁。所以我所做的只是使用了我从 ASIHTTPRequest 中获取的一些方法:

    [request setComplete:YES];
    [request setDownloadComplete:YES];
    [request requestFinished];
    [request markAsFinished];

虽然前两种方法不是公开的并且Xcode显示警告,但它仍然有效。

顺便说一句,就在 2 天前,我看到一个 post 说不再支持 ASIHTTPRequest :(

【讨论】:

    最近更新 更多