如何访问NSHTTPURLResponse的“Content-Type”标题?

时间:2014-09-01 19:25:31

标签: ios swift content-type nshttpurlresponse

这是我天真的第一次密码:

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

我已尝试过对此代码的各种推导,但我不断收到与allHeaderFields属性的NSDictionary类型之间的基本阻抗不匹配有关的编译器警告/错误以及我希望获得String或可选String。

只是不确定如何胁迫这些类型。

4 个答案:

答案 0 :(得分:24)

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

let task = URLSession.shared.dataTask(with: url) { data, response, error in
    if let httpResponse = response as? HTTPURLResponse, let contentType = httpResponse.allHeaderFields["Content-Type"] as? String {
        // use contentType here
    }
}
task.resume()

显然,在这里,我将从URLResponseresponse变量)转到HTTPURLResponse,并从allHeaderFields获取数据。如果您已经拥有HTTPURLResponse,那么它会更简单,但希望这说明了这个想法。

对于Swift 2,请参阅previous revision of this answer

答案 1 :(得分:1)

这适用于Xcode 6.1:

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

不再需要多次演员表。

在使用Swift 1.2的Xcode 6.3中,这有效:

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

答案 2 :(得分:0)

答案 3 :(得分:-2)

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

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

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

但问题是响应可能会将键的名称作为大写的一个或小写的一个返回,而NSDictionary对键是真的区分大小写,所以你应该对键进行自己不区分大小写的搜索< / p>

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;
     }
 }