web-dev-qa-db-fra.com

Comment puis-je accéder à l'en-tête "Content-Type" d'un NSHTTPURLResponse?

Voici mon premier code de passe naïf:

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

J'ai essayé diverses dérivations de ce code, mais je continue à avoir des avertissements/erreurs du compilateur liés au décalage d'impédance de base entre le type NSDictionary de la propriété allHeaderFields et mon désir d'obtenir uniquement une chaîne ou une chaîne facultative.

Juste pas sûr de savoir comment contraindre les types.

14
Daniel

Vous pouvez faire quelque chose comme ce qui suit dans 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()

Évidemment, je passe ici de la variable URLResponse (la variable response) à la variable HTTPURLResponse, en passant des données à partir de allHeaderFields. Si vous avez déjà la HTTPURLResponse, alors c'est plus simple, mais j'espère que cela illustre l'idée.

Pour Swift 2, voir révision précédente de cette réponse .

21
Rob

Cela fonctionne avec Xcode 6.1:

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

Plusieurs lancers ne sont plus nécessaires.

Et dans Xcode 6.3 avec Swift 1.2, cela fonctionne:

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

J'utilise une extension à URLResponse pour simplifier celle-ci (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
    }
}
0
eskimwier
0
Greg Brown