我正在尝试从提供图像的 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,我仍然希望下载图像。
您这里的代码对我来说看起来很好,除了我有点困惑为什么您使用缩略图的下载任务(大概很小,并且可能不需要保存到磁盘)。
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
(或您为该参数命名的任何名称),然后使用新请求调用完成处理程序。