当服务器发出重定向时,NSURLSessionDownloadTask 会导致 404 状态

问题描述 投票:0回答:1

我正在尝试从提供图像的 CDN 下载 Objective C 中的图像。如果图像 URL 与请求的 URL 相同,则此方法可以正常工作。但某些图像会导致重定向到不同的 URL(甚至不同的域)。例如,这可能是请求 URL,但 CDN 将重定向到第二个 URL。

如果在浏览器或其他上下文中查看此内容,它可以正常工作(URL 会更新,但图像会正确显示)。但是当尝试使用 NSURLSessionDownloadTask 下载它时,会导致 404 状态代码。

这是我用来执行下载的代码。如果图像未重定向(下载的图像的 URL 与请求的图像 URL 相同),则该代码确实可以工作。但否则,如果服务器确实执行任何重定向,则会导致 404 状态。

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
configuration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
configuration.URLCache = nil;
configuration.timeoutIntervalForRequest = 5 * 60;
        
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:nil delegateQueue:nil];

NSURLRequest *request = [NSURLRequest requestWithURL:key.url];
            
NSURLSessionDownloadTask *task = [session downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    NSInteger statusCode = 0;
    NSHTTPURLResponse *httpResponse = nil;
    if ([response isKindOfClass:NSHTTPURLResponse.class]) {
        httpResponse = (NSHTTPURLResponse *)response;
        statusCode = httpResponse.statusCode;
    } else {
        statusCode = error.code;
    }

    // the status code is 404 when the server issues a redirect
}];

[task resume];

有谁知道我可以做些什么来让它发挥作用?如果我从 URL1 请求图像,但它在 URL2 上返回,那么我只想下载。无论服务器是否重定向到不同的 URL,我仍然希望下载图像。

ios nsurlconnection nsurlsession nsurlrequest nsurlsessiondownloadtask
1个回答
0
投票

您这里的代码对我来说看起来很好,除了我有点困惑为什么您使用缩略图的下载任务(大概很小,并且可能不需要保存到磁盘)。

NSURLSession 会自动遵循重定向,除非您专门在会话委托上创建一个委托方法来覆盖该行为。

此外,无论任何 NSURLSession 配置如何,重定向始终涉及 3xx 范围内的状态代码,而不是 404。除非 URL 确实指向任何内容,否则没有可行的方法来获取 404。

我无法告诉您服务器端出了什么问题,但是 A. 您发送的 URL 确实是错误的,B. 它重定向到不存在的资源的 URL,或者 C. 它重定向到一个循环。

为了调试它,我首先添加一个带有重定向处理程序方法的委托,以便您可以在重定向发生时记录它们。这应该可以更容易地弄清楚到底发生了什么。

有关详细信息,请参阅

URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:
方法的文档:

https://developer.apple.com/documentation/foundation/nsurlsessiontaskdelegate/1411626-urlsession

但在较高级别上,记录

task.currentRequest.URL
newRequest.URL
(或您为该参数命名的任何名称),然后使用新请求调用完成处理程序。

© www.soinside.com 2019 - 2024. All rights reserved.