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?
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
}
}
Swift 2 et versions ultérieures (xCode 7)
var s = "aa bb -[:/?&=;+!@#$()',*]";
let sEncode = s.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())
let sDecode = sEncode?.stringByRemovingPercentEncoding
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à.
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)" )
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")