如何访问 NSHTTPURLResponse 的 "Content-Type" 标头?



这是我天真的第一次通过代码:

var httpUrlResponse: NSHTTPURLResponse? // = (...get from server...)
let contentType = httpUrlResponse?.allHeaderFields["Content-Type"]

我已经尝试了该代码的各种派生,但我不断收到编译器警告/错误,这些警告/错误与allHeaderFields属性的NSDictionary类型与我只想获得String或可选String之间的基本阻抗不匹配有关。

只是不知道如何强制类型。

您可以在Swift 3中执行以下操作:

if
    let httpResponse = response as? HTTPURLResponse, 
    let contentType = httpResponse.value(forHTTPHeaderField: "Content-Type") 
{
    // use contentType here
}
task.resume()

显然,这里我要从URLResponseresponse变量)转到HTTPURLResponse。我使用的不是allHeaderFields,而是类型化的value(forHTTPHeaderField:),它使用不区分大小写的键。

希望这能说明这个想法。

对于Swift 2,请参阅此答案的先前修订。

这适用于Xcode 6.1:

let contentType = httpUrlResponse?.allHeaderFields["Content-Type"] as String?

不再需要多次强制转换。

在Xcode 6.3和Swift 1.2中,这是有效的:

let contentType = httpUrlResponse?.allHeaderFields["Content-Type"] as? String

我使用URLResponse的扩展来简化这个(Swift 3):

extension URLResponse {
    func getHeaderField(key: String) -> String? {
       if let httpResponse = self as? HTTPURLResponse {
           if let field = httpResponse.allHeaderFields[key] as? String {
                return field
            }
        }
        return nil
    }
}

您可以只使用MIMEType属性吗?

https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURLResponse_Class/#//apple_ref/occ/instp/NSURLResponse/MIMEType

实际上,它应该像这个一样简单

NSString* contentType = [[(NSHTTPURLResponse*)theResponse allHeaderFields] valueForKey:@"content-type"];

NSString* contentType = [[(NSHTTPURLResponse*)theResponse allHeaderFields][@"content-type"]];

但问题是,响应可能会以大写或小写的形式返回密钥的名称,而NSDictionary对密钥确实区分大小写,因此您应该自己对密钥进行不区分大小写的搜索

NSDictionary* allFields = [[(NSHTTPURLResponse*)theResponse allHeaderFields];
NSString* contentType;
for (NSString* key in allFields.allKeys) {
     if ([key compare:@"content-type" options:NSCaseInsensitiveSearch] == NSOrderedSame) {
          // This is it
          contentType = allFields[key];
          break;
     }
 }

相关内容

  • 没有找到相关文章

最新更新