web-dev-qa-db-fra.com

URL décodage sous iOS

J'utilise Swift 1.2 pour développer mon application iPhone et je communique avec un service Web http.

La réponse que je reçois est au format chaîne de requête (paires clé-valeur) et URL encodée en .Net

Je peux obtenir la réponse, mais en cherchant le bon moyen de décoder avec Swift.

Exemple de réponse:

status=1&message=The+transaction+for+GBP+12.50+was+successful

J'ai essayé de suivre le moyen de décoder et d'obtenir la réponse du serveur

// This provides encoded response String
var responseString = NSString(data: data, encoding: NSUTF8StringEncoding) as! String
var decodedResponse = responseString.stringByReplacingEscapesUsingEncoding(NSUTF8StringEncoding)!

Comment puis-je remplacer tous les caractères d'échappement URL de la chaîne?

27
JibW

Pour encoder et décoder des URL, créez cette extension quelque part dans le projet:

Swift 2.0

extension String
{   
    func encodeUrl() -> String
    {
        return self.stringByAddingPercentEncodingWithAllowedCharacters( NSCharacterSet.URLQueryAllowedCharacterSet())
    }
func decodeUrl() -> String
    {
        return self.stringByRemovingPercentEncoding
    }

}

Swift 3.0

 extension String
    {   
        func encodeUrl() -> String
        {
            return self.addingPercentEncoding( withAllowedCharacters: NSCharacterSet.urlQueryAllowed())
        }
    func decodeUrl() -> String
        {
            return self.removingPercentEncoding
        }

    }

Swift 4.1

extension String
{
    func encodeUrl() -> String?
    {
        return self.addingPercentEncoding( withAllowedCharacters: NSCharacterSet.urlQueryAllowed)
    }
    func decodeUrl() -> String?
    {
        return self.removingPercentEncoding
    }
}
65
Vyacheslav

Swift 2 et versions ultérieures (xCode 7)

var s = "aa bb -[:/?&=;+!@#$()',*]";

let sEncode = s.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())

let sDecode = sEncode?.stringByRemovingPercentEncoding
8
米米米

La méthode stringByReplacingEscapesUsingEncoding se comporte correctement. Le caractère "+" est ne fait pas partie de l'encodage à pourcentage . Ce serveur ne l'utilise pas correctement. il devrait utiliser un espace échappé en pourcentage ici (%20). Si, pour une réponse particulière, vous souhaitez des espaces contenant des caractères "+", il vous suffit de contourner le comportement du serveur en effectuant vous-même la substitution, comme vous le faites déjà.

3
matt

Dans Swift 3

extension URL {
    var parseQueryString: [String: String] {
        var results = [String: String]()

        if let pairs = self.query?.components(separatedBy: "&"),  pairs.count > 0 {
            for pair: String in pairs {
                if let keyValue = pair.components(separatedBy: "=") as [String]? {
                    results.updateValue(keyValue[1], forKey: keyValue[0])
                }
            }
        }
        return results
    }
}

dans votre code pour accéder ci-dessous

let parse = url.parseQueryString
        print("parse \(parse)" )
0
Rob-4608

Dans mon cas, j’ai besoin d’un signal plus ("+") dans un numéro de téléphone dans les paramètres d’une chaîne de requête, comme "+55 11 99999-5555". Après avoir découvert que l'encodeur Swift3 (xcode 8.2) n'encodait pas le signe "+", mais l'espace, je devais faire appel à une solution de contournementaprès l'encodage:

Swift 3.0

_strURL = _strURL.replacingOccurrences(of: "+", with: "%2B")
0
Caiçara