web-dev-qa-db-de.com

Verwendung von stringByAddingPercentEncodingWithAllowedCharacters () für eine URL in Swift 2.0

Ich habe dies in Swift 1.2

let urlwithPercentEscapes = myurlstring.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)

Dies gibt mir jetzt eine Warnung mit der Bitte, sie zu verwenden

stringByAddingPercentEncodingWithAllowedCharacters

Ich muss ein NSCharacterSet als Argument verwenden, aber es gibt so viele und ich kann nicht bestimmen, welches mir das gleiche Ergebnis wie die zuvor verwendete Methode liefert .

Eine Beispiel-URL, die ich verwenden möchte, sieht folgendermaßen aus

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

Der URL-Zeichensatz für die Codierung scheint Sätze zu enthalten, die meine URL zuschneiden. d.h.

Die Pfadkomponente einer URL ist die Komponente, die unmittelbar auf die Hostkomponente folgt (falls vorhanden). Es endet dort, wo die Abfrage- oder Fragmentkomponente beginnt. In der URL http://www.example.com/index.php?key1=value1 lautet die Pfadkomponente beispielsweise /index.php.

Jedoch möchte ich keinen Aspekt davon beschneiden. Wenn ich meinen String verwendete, zum Beispiel myurlstring, schlug dies fehl.

Aber wenn die folgenden verwendet werden, dann gab es keine Probleme. Es verschlüsselte die Zeichenfolge mit etwas Magie und ich konnte meine URL-Daten abrufen.

let urlwithPercentEscapes = myurlstring.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)

Als es

Gibt eine Darstellung der Zeichenfolge unter Verwendung einer angegebenen Codierung zurück, um die für die Konvertierung der Zeichenfolge in eine zulässige URL-Zeichenfolge erforderlichen Prozentzeichen zu bestimmen

Vielen Dank

63
DogCoffee

Für die angegebene URL-Zeichenfolge das Äquivalent zu

let urlwithPercentEscapes = myurlstring.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)

ist der Zeichensatz URLQueryAllowedCharacterSet

let urlwithPercentEscapes = myurlstring.stringByAddingPercentEncodingWithAllowedCharacters( NSCharacterSet.URLQueryAllowedCharacterSet())

Swift 3:

let urlwithPercentEscapes = myurlstring.addingPercentEncoding( withAllowedCharacters: .urlQueryAllowed)

Es codiert alles nach dem Fragezeichen in der URL-Zeichenfolge.

Da die Methode stringByAddingPercentEncodingWithAllowedCharacters nil zurückgeben kann, verwenden Sie optionale Bindungen, wie in der Antwort von Leo Dabus vorgeschlagen.

150
vadian

Dies hängt von Ihrer URL ab. Wenn Ihre URL ein Pfad ist, können Sie den Zeichensatz rlPathAllowed verwenden

let myFileString = "My File.txt"
if let urlwithPercentEscapes = myFileString.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) {
    print(urlwithPercentEscapes)  // "My%20File.txt"
}

Erstellen eines Zeichensatzes für die URL-Codierung

urlFragmentAllowed

urlHostAllowed

urlPasswordAllowed

urlQueryAllowed

urlUserAllowed

Sie können auch Ihren eigenen URL-Zeichensatz erstellen:

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"
}

Eine andere Option ist verwenden Sie URLComponents, um Ihre URL korrekt zu erstellen

17
Leo Dabus

Swift 3.0 (From grokswift )

Das Erstellen von URLs aus Zeichenfolgen ist ein Minenfeld für Fehler. Vermissen Sie einfach eine einzelne/oder versehentlich verschlüsselte URL? In einer Abfrage schlägt Ihr API-Aufruf fehl und Ihre App kann keine Daten anzeigen (oder stürzt sogar ab, wenn Sie diese Möglichkeit nicht erwartet haben). Seit iOS 8 gibt es eine bessere Möglichkeit, URLs mit NSURLComponents und NSURLQueryItems zu erstellen.

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
}

Unten finden Sie den Code für den Zugriff auf die URL mit der Anweisung guard.

guard let url = createURLWithComponents() else {
            print("invalid URL")
            return nil
      }
      print(url)

Ausgabe:

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

In Swift 3.1 verwende ich ungefähr Folgendes:

let query = "param1=value1&param2=" + valueToEncode.addingPercentEncoding(withAllowedCharacters: .alphanumeric)

Es ist sicherer als .urlQueryAllowed und die anderen, da es alle anderen Zeichen als AZ, AZ und 0-9 codiert. Dies funktioniert besser, wenn der Wert, den Sie codieren, Sonderzeichen wie?, &, =, + Und Leerzeichen enthalten kann.

3

In meinem Fall, in dem die letzte Komponente nicht lateinische Zeichen war, habe ich in Swift 2.2 Folgendes getan:

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