web-dev-qa-db-fra.com

Comment utiliser stringByAddingPercentEncodingWithAllowedCharacters () pour une URL dans Swift 2.0

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

63
DogCoffee

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.

150
vadian

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

17
Leo Dabus

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
6
Ashok R

Dans Swift 3.1, j'utilise quelque chose comme ce qui suit:

let query = "param1=value1&param2=" + 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.

3

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;
}
}
2
Bobj-C

Swift 4.

let encodedData = myUrlString.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed)
1
Supertecnoboff