Ios 我如何访问;“内容类型”;NSHTTPPURLResponse的标题?
以下是我天真的第一次通过代码:Ios 我如何访问;“内容类型”;NSHTTPPURLResponse的标题?,ios,swift,content-type,nshttpurlresponse,Ios,Swift,Content Type,Nshttpurlresponse,以下是我天真的第一次通过代码: var httpUrlResponse: NSHTTPURLResponse? // = (...get from server...) let contentType = httpUrlResponse?.allHeaderFields["Content-Type"] 我已经尝试了这段代码的各种派生,但我不断收到编译器警告/错误,这些警告/错误与allHeaderFields属性的NSDictionary类型和我只想获得字符串或可选字符串之间的基本阻抗不匹配有
var httpUrlResponse: NSHTTPURLResponse? // = (...get from server...)
let contentType = httpUrlResponse?.allHeaderFields["Content-Type"]
我已经尝试了这段代码的各种派生,但我不断收到编译器警告/错误,这些警告/错误与allHeaderFields属性的NSDictionary类型和我只想获得字符串或可选字符串之间的基本阻抗不匹配有关
只是不知道如何强制这些类型。实际上,它应该像这样简单
NSString* contentType = [[(NSHTTPURLResponse*)theResponse allHeaderFields] valueForKey:@"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;
}
}
这适用于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
您可以在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()
显然,这里我要从urresponse
(response
变量)到httpurresponse
,并从allHeaderFields
获取数据。如果您已经有了HTTPURLResponse
,那么它会更简单,但希望这能说明这个想法
有关Swift 2,请参见。您可以只使用
MIMEType
属性吗
我使用URL响应的扩展来简化此响应(Swift 3):
请回答Swift语言。对不起,我认为用Swift标记问题并包含Swift示例代码会有所帮助。此外,我认为查找是不区分大小写的(根据文档)。HTTP头字段不区分大小写,而字典查找是区分大小写的,但根据
allHeaderFields
文档,幸运的是,“为了简化代码,某些头字段名称被规范化为其标准形式”。所以你可以查找内容类型
@Daniel你应该只在Swift上标记它,上面有一个Objective-C标记!所以不管怎么说,如果你不知道如何把它转换成Swift,你就陷入了一个大麻烦trouble@AubadaTaljo用objective-c标记这一点也是完全有效的。他们提供的代码是swift提供的,所以你应该提供一个快速的答案,这样做的方式是,如果他们自己不能转换代码,你就不会告诉他们他们遇到了大麻烦,如果他们知道如何转换,他们就不会问这个问题。回答不好,因为你没有正确阅读问题,在澄清后没有提供他们想要的。如果你想变得挑剔,看起来你不知道你在回答什么。为什么你需要在把它转换成字符串之前先转换成NSString呢?难道不是吗?字符串
work?@AaronBrager-BTW,如果让contentType=。。。作为?NSSTRINGAS?不再需要字符串。我刚刚在Xcode 6.3.1中对其进行了测试,直接转换到字符串的简单转换现在可以正常工作了。因此,我从我的答案中删除了前一个繁琐的语法。第二个语句甚至在1.2之前就可以使用,但我想在9月份就不行了?
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()
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
}
}