J'utilisais ceci, dans Swift 1.2
let urlwithPercentEscapes = myurlstring.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
Cela me donne maintenant un avertissement me demandant d'utiliser
stringByAddingPercentEncodingWithAllowedCharacters
J'ai besoin d'utiliser un NSCharacterSet comme argument, mais il y en a beaucoup et je ne peux pas déterminer quel résultat me donnera le même résultat que la méthode précédemment utilisée .
Un exemple d'URL que je veux utiliser sera comme ceci
http://www.mapquestapi.com/geocoding/v1/batch?key=YOUR_KEY_HERE&callback=renderBatch&location=Pottsville,PA&location=Red Lion&location=19036&location=1090 N Charlotte St, Lancaster, PA
Le jeu de caractères d'URL pour le codage semble contenir des ensembles de rognage mon URL. c'est à dire,
Le composant de chemin d'accès d'une URL est le composant qui suit immédiatement le composant Host (s'il est présent). Il se termine là où commence le composant de requête ou de fragment. Par exemple, dans l'URL http://www.example.com/index.php?key1=value1 , le composant de chemin d'accès est /index.php.
Cependant, je ne veux en couper aucun aspect. Lorsque j’utilisais ma chaîne, par exemple myurlstring
, il échouait.
Mais quand utilisé le suivant, alors il n'y avait aucun problème. Il encodait la chaîne avec un peu de magie et je pouvais obtenir mes données d'URL.
let urlwithPercentEscapes = myurlstring.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
Comme ca
Renvoie une représentation de la chaîne en utilisant un codage donné pour déterminer le pourcentage d'évasions nécessaires pour convertir la chaîne en une chaîne d'URL légale.
Merci
Pour la chaîne d'URL donnée, l'équivalent de
let urlwithPercentEscapes = myurlstring.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
est le jeu de caractères URLQueryAllowedCharacterSet
let urlwithPercentEscapes = myurlstring.stringByAddingPercentEncodingWithAllowedCharacters( NSCharacterSet.URLQueryAllowedCharacterSet())
Swift 3:
let urlwithPercentEscapes = myurlstring.addingPercentEncoding( withAllowedCharacters: .urlQueryAllowed)
Il encode tout ce qui suit le point d'interrogation dans la chaîne d'URL.
Comme la méthode stringByAddingPercentEncodingWithAllowedCharacters
peut renvoyer nil, utilisez les liaisons facultatives comme suggéré dans la réponse de Leo Dabus.
Cela dépendra de votre URL. Si votre URL est un chemin, vous pouvez utiliser le jeu de caractères rlPathAllowed
let myFileString = "My File.txt"
if let urlwithPercentEscapes = myFileString.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) {
print(urlwithPercentEscapes) // "My%20File.txt"
}
Création d'un jeu de caractères pour le codage d'URL
urlFragmentAllowed
urlHostAllowed
urlPasswordAllowed
urlQueryAllowed
urlUserAllowed
Vous pouvez également créer votre propre jeu de caractères url:
let myUrlString = "http://www.mapquestapi.com/geocoding/v1/batch?key=YOUR_KEY_HERE&callback=renderBatch&location=Pottsville,PA&location=Red Lion&location=19036&location=1090 N Charlotte St, Lancaster, PA"
let urlSet = CharacterSet.urlFragmentAllowed
.union(.urlHostAllowed)
.union(.urlPasswordAllowed)
.union(.urlQueryAllowed)
.union(.urlUserAllowed)
extension CharacterSet {
static let urlAllowed = CharacterSet.urlFragmentAllowed
.union(.urlHostAllowed)
.union(.urlPasswordAllowed)
.union(.urlQueryAllowed)
.union(.urlUserAllowed)
}
if let urlwithPercentEscapes = myUrlString.addingPercentEncoding(withAllowedCharacters: .urlAllowed) {
print(urlwithPercentEscapes) // "http://www.mapquestapi.com/geocoding/v1/batch?key=YOUR_KEY_HERE&callback=renderBatch&location=Pottsville,PA&location=Red%20Lion&location=19036&location=1090%20N%20Charlotte%20St,%20Lancaster,%20PA"
}
Une autre option est de tilisez URLComponents pour créer correctement votre URL
Swift 3.0 (à partir de grokswift )
La création d'URL à partir de chaînes est un terrain miné pour les bugs. Il suffit de manquer un seul/ou accidentellement URL encoder le? Dans une requête, votre appel d'API échouera et votre application n'aura aucune donnée à afficher (ou même se bloquerait si vous n'aviez pas anticipé cette possibilité). Depuis iOS 8, il existe un meilleur moyen de créer des URL en utilisant NSURLComponents
et NSURLQueryItems
.
func createURLWithComponents() -> URL? {
var urlComponents = URLComponents()
urlComponents.scheme = "http"
urlComponents.Host = "www.mapquestapi.com"
urlComponents.path = "/geocoding/v1/batch"
let key = URLQueryItem(name: "key", value: "YOUR_KEY_HERE")
let callback = URLQueryItem(name: "callback", value: "renderBatch")
let locationA = URLQueryItem(name: "location", value: "Pottsville,PA")
let locationB = URLQueryItem(name: "location", value: "Red Lion")
let locationC = URLQueryItem(name: "location", value: "19036")
let locationD = URLQueryItem(name: "location", value: "1090 N Charlotte St, Lancaster, PA")
urlComponents.queryItems = [key, callback, locationA, locationB, locationC, locationD]
return urlComponents.url
}
Vous trouverez ci-dessous le code permettant d’accéder à l’URL à l’aide de l’instruction guard
.
guard let url = createURLWithComponents() else {
print("invalid URL")
return nil
}
print(url)
Sortie:
http://www.mapquestapi.com/geocoding/v1/batch?key=YOUR_KEY_HERE&callback=renderBatch&location=Pottsville,PA&location=Red%20Lion&location=19036&location=1090%20N%20Charlotte%20St,%20Lancaster,%20PA
Dans Swift 3.1, j'utilise quelque chose comme ce qui suit:
let query = "param1=value1¶m2=" + valueToEncode.addingPercentEncoding(withAllowedCharacters: .alphanumeric)
C'est plus sûr que .urlQueryAllowed et les autres, parce que cela encodera tous les caractères autres que A-Z, a-z et 0-9. Cela fonctionne mieux lorsque la valeur que vous codez peut utiliser des caractères spéciaux tels que?, &, =, + Et des espaces.
Dans mon cas où le dernier composant était des caractères non latins, j’ai fait ce qui suit dans Swift 2.2:
extension String {
func encodeUTF8() -> String? {
//If I can create an NSURL out of the string nothing is wrong with it
if let _ = NSURL(string: self) {
return self
}
//Get the last component from the string this will return subSequence
let optionalLastComponent = self.characters.split { $0 == "/" }.last
if let lastComponent = optionalLastComponent {
//Get the string from the sub sequence by mapping the characters to [String] then reduce the array to String
let lastComponentAsString = lastComponent.map { String($0) }.reduce("", combine: +)
//Get the range of the last component
if let rangeOfLastComponent = self.rangeOfString(lastComponentAsString) {
//Get the string without its last component
let stringWithoutLastComponent = self.substringToIndex(rangeOfLastComponent.startIndex)
//Encode the last component
if let lastComponentEncoded = lastComponentAsString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.alphanumericCharacterSet()) {
//Finally append the original string (without its last component) to the encoded part (encoded last component)
let encodedString = stringWithoutLastComponent + lastComponentEncoded
//Return the string (original string/encoded string)
return encodedString
}
}
}
return nil;
}
}
Swift 4.
let encodedData = myUrlString.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed)