wake-up-neo.net

So codieren Sie eine URL in Swift

Dies ist meine URL

Das Problem ist, dass das address-Feld nicht an urlpath angehängt wird.

Weiß jemand warum das so ist?

var address:string
address = "American Tourister, Abids Road, Bogulkunta, Hyderabad, Andhra Pradesh, India"
let urlpath = NSString(format: "http://maps.googleapis.com/maps/api/geocode/json?address="+"\(address)")
116
user3541467

Verwenden Sie stringByAddingPercentEncodingWithAllowedCharacters

var escapedAddress = address.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())

Verwenden Sie stringByAddingPercentEscapesUsingEncoding: In iOS 9 und OS X v10.11 nicht mehr unterstützt

var address = "American Tourister, Abids Road, Bogulkunta, Hyderabad, Andhra Pradesh, India"
var escapedAddress = address.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
let urlpath = NSString(format: "http://maps.googleapis.com/maps/api/geocode/json?address=\(escapedAddress)")

Swift 3

var address = "American Tourister, Abids Road, Bogulkunta, Hyderabad, Andhra Pradesh, India"
let escapedAddress = address.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)
let urlpath = String(format: "http://maps.googleapis.com/maps/api/geocode/json?address=\(escapedAddress)")
181
Bryan Chen

Wenn es möglich ist, dass der Wert, den Sie zu Ihrer URL hinzufügen, reservierte Zeichen enthalten kann (wie in Abschnitt 2 von RFC 3986 definiert), müssen Sie möglicherweise Ihre prozentuale Escaping-Einschränkung verfeinern. Obwohl & und + gültige Zeichen in einer URL sind, sind sie innerhalb eines URL-Abfrageparameterwerts nicht gültig (da & als Trennzeichen zwischen Abfrageparametern verwendet wird, die Ihren Wert vorzeitig beenden würden, und + in ein Leerzeichen übersetzt wird.) . Unglücklicherweise lässt der standardmäßige Prozentsatz der Begrenzer diese Begrenzungszeichen unberührt.

Daher möchten Sie möglicherweise alle Zeichen, die nicht in der Liste der nicht reservierten Zeichen von RFC 3986 enthalten sind, mit einem Escape-Befehl versehen: 

Zeichen, die in einem URI zulässig sind, aber keine reservierten .__ haben. Zweck werden als uneingeschränkt bezeichnet. Dazu gehören Groß- und Kleinbuchstaben Buchstaben, Dezimalstellen, Bindestrich, Punkt, Unterstrich und Tilde.

 unreserviert = ALPHA/DIGIT/"-"/"."/"_"/"~" 

Später, in Abschnitt 3.4, beabsichtigt der RFC, der Liste der erlaubten Zeichen in einer Abfrage ? und / hinzuzufügen:

Die Schrägstriche ("/") und Fragezeichen ("?") Können Daten .__ darstellen. innerhalb der Abfragekomponente. Beachten Sie, dass einige ältere, fehlerhafte Implementierungen behandeln solche Daten möglicherweise nicht korrekt, wenn sie als .__ verwendet werden. der Basis-URI für relative Referenzen (Abschnitt 5.1) anscheinend weil sie Abfragedaten nicht von Pfaddaten unterscheiden können, wenn Suche nach hierarchischen Trennzeichen. Jedoch als Abfragekomponenten werden häufig verwendet, um identifizierende Informationen in Form von .__ zu tragen. "key = value" -Paare und ein häufig verwendeter Wert ist eine Referenz auf Bei einer anderen URI ist es manchmal besser für die Verwendung von Prozent - Kodierung dieser Zeichen.

Heutzutage würden Sie URLComponents verwenden, um den Abfragewert prozentual zu umgehen:

var address = "American Tourister, Abids Road, Bogulkunta, Hyderabad, Andhra Pradesh, India"
var components = URLComponents(string: "http://maps.googleapis.com/maps/api/geocode/json")!
components.queryItems = [URLQueryItem(name: "address", value: address)]
let url = components.url!

Übrigens, obwohl in dem oben genannten RFC nicht berücksichtigt, Abschnitt 4.10.22.6, URL-kodierte Formulardaten der W3C-HTML-Spezifikation, besagen application/x-www-form-urlencoded-Anforderungen auch Leerzeichen durch +-Zeichen (und enthalten das Sternchen) in den Zeichen, die nicht maskiert werden sollten). Und leider wird URLComponents nicht ordnungsgemäß entkommen, daher rät Apple, dass Sie es manuell entziehen, bevor Sie die url-Eigenschaft des URLComponents-Objekts abrufen:

// configure `components` as shown above, and then:

components.percentEncodedQuery = components.percentEncodedQuery?.replacingOccurrences(of: "+", with: "%2B")
let url = components.url!

Für die Swift-2-Wiedergabe, bei der ich all diesen Prozentsatz manuell erledige, gehe ich in die vorherige Version dieser Antwort .

62
Rob

Swift 3:

let escapedString = originalString.addingPercentEncoding(withAllowedCharacters:NSCharacterSet.urlQueryAllowed)
59
Yusuf X

Swift 2.0

let needsLove = "string needin some URL love"
let safeURL = needsLove.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())!

Hilfreiche Programmiertipps und Hacks

33
quemeful

URLQueryAllowedCharacterSet sollte nicht für die URL-Codierung von Abfrageparametern verwendet werden, da dieser Zeichensatz &, ?, / usw. enthält, die als Begrenzer in einer URL-Abfrage dienen, z.

/?paramname=paramvalue&paramname=paramvalue

Diese Zeichen sind in URL-Abfragen insgesamt zulässig, nicht jedoch in Parameterwerten.

RFC 3986 spricht spezifisch über unreserved Zeichen, die sich von erlaubten unterscheiden:

2.3. Nicht reservierte Zeichen

Zeichen, die in einer URI zulässig sind, aber keine reservierten haben
Zweck werden als uneingeschränkt bezeichnet. Dazu gehören Groß- und Kleinbuchstaben Buchstaben, Dezimalstellen, Bindestrich, Punkt, Unterstrich und Tilde.

  unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"

Entsprechend:

extension String {
    var URLEncoded:String {
        let unreservedChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~"
        let unreservedCharset = NSCharacterSet(charactersInString: unreservedChars)
        let encodedString = self.stringByAddingPercentEncodingWithAllowedCharacters(unreservedCharset)
        return encodedString ?? self
    }
}

Der obige Code ruft wegen der enormen Größe des zurückgegebenen Zeichensatzes (103806 Zeichen) keinen Aufruf an alphanumericCharacterSet auf. Im Hinblick auf die Anzahl der Unicode-Zeichen, die alphanumericCharacterSet zulässt, wäre die Verwendung zum Zwecke der URL-Codierung einfach fehlerhaft.

Verwendungszweck:

let URLEncodedString = myString.URLEncoded
10
Desmond Hume

Swift 4.1

Erstellen Sie einen "Zeichensatz" basierend auf der gewünschten Option (urlQueryAllowed). Entfernen Sie dann die zusätzlichen Zeichen, die Sie nicht möchten (+ &). Übergeben Sie dann diesen Zeichensatz an "Hinzufügen von PercentEncoding".

var address = "American Tourister, Abids Road, Bogulkunta, Hyderabad, Andhra Pradesh, India"
var queryCharSet = NSCharacterSet.urlQueryAllowed
queryCharSet.remove(charactersIn: "+&")
let escapedAddress = address.addingPercentEncoding(withAllowedCharacters: queryCharSet)!
let urlpath = String(format: "http://maps.googleapis.com/maps/api/geocode/json?address=\(escapedAddress)")
6
Daryl

XCODE 8, Swift 3.0

From grokswift

Das Erstellen von URLs aus Strings ist ein Minenfeld für Fehler. Verpassen Sie einfach eine einzelne oder versehentlich URL-Codierung in einer Abfrage.) Ihr API-Aufruf schlägt fehl und Ihre App hat keine Daten zum Anzeigen (oder stürzt sogar ab, wenn Sie dies tun Ich habe nicht mit dieser Möglichkeit gerechnet.) 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 = "maps.googleapis.com"
    urlComponents.path = "/maps/api/geocode/json"

    let addressQuery = URLQueryItem(name: "address", value: "American Tourister, Abids Road, Bogulkunta, Hyderabad, Andhra Pradesh, India")
    urlComponents.queryItems = [addressQuery]

    return urlComponents.url
}

Unten ist der Code für den Zugriff auf die URL mit der guard-Anweisung.

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

Ausgabe: 

http://maps.googleapis.com/maps/api/geocode/json?address=American%20Tourister,%20Abids%20Road,%20Bogulkunta,%20Hyderabad,%20Andhra%20Pradesh,%20India

Weitere Informationen: Erstellen von URLs mit NSURLC-Komponenten und NSURLQueryItems

6
Ashok R

Aktualisiert für Swift 3:

var escapedAddress = address.addingPercentEncoding(
    withAllowedCharacters: CharacterSet.urlQueryAllowed)
4
Pavlos

In Mac OS 10.9 Maverics und iOS 7 wurde NSURLComponents eingeführt, das die Codierung der verschiedenen URL-Teile auf ziemlich bequeme Weise erledigt.

Die NSURLComponents-Klasse ist eine Klasse, die URLs analysiert basierend auf RFC 3986 und zum Erstellen von URLs aus ihren Bestandteilen . Sein Verhalten unterscheidet sich geringfügig von der NSURL-Klasse, die mit .__ übereinstimmt. ältere RFCs. Sie können jedoch leicht ein NSURL-Objekt auf der Basis von .__ erhalten. den Inhalt eines URL-Komponentenobjekts oder umgekehrt.

let address = "American Tourister, Abids Road, Bogulkunta, Hyderabad, Andhra Pradesh, India"

let components = NSURLComponents(string: "http://maps.googleapis.com/maps/api/geocode/json")!
// create a query item key=value
let queryItem = NSURLQueryItem(name: "address", value: address)
// add the query item to the URL, NSURLComponents takes care of adding the question mark.
components.queryItems = [queryItem]
// get the properly percent encoded string
let urlpath = components.string!
print(urlpath)
3
vadian

Sie müssen lediglich die Antwort von Desmond Hume ausfüllen, um die String-Klasse für eine RFC 3986-nicht-reservierte Zeichengültige Codierungsfunktion zu erweitern (erforderlich, wenn Sie Abfrage-FORM-Parameter codieren):

Swift 3

extension String {

    var RFC3986UnreservedEncoded:String {
        let unreservedChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~"
        let unreservedCharsSet: CharacterSet = CharacterSet(charactersIn: unreservedChars)
        let encodedString: String = self.addingPercentEncoding(withAllowedCharacters: unreservedCharsSet)!
        return encodedString
    }
}
2
Jorge Ramírez

Ich musste meine Parameter mit ISO-8859-1 kodieren, sodass die Methode "PercentEncoding ()" für mich nicht funktioniert.

extension String {

  // Url percent encoding according to RFC3986 specifications
  // https://tools.ietf.org/html/rfc3986#section-2.1
  func urlPercentEncoded(withAllowedCharacters allowedCharacters: 
    CharacterSet, encoding: String.Encoding) -> String {
    var returnStr = ""

    // Compute each char seperatly
    for char in self {
      let charStr = String(char)
      let charScalar = charStr.unicodeScalars[charStr.unicodeScalars.startIndex]
      if allowedCharacters.contains(charScalar) == false,
        let bytesOfChar = charStr.data(using: encoding) {
        // Get the hexStr of every notAllowed-char-byte and put a % infront of it, append the result to the returnString
        for byte in bytesOfChar {
          returnStr += "%" + String(format: "%02hhX", byte as CVarArg)
        }
      } else {
        returnStr += charStr
      }
    }

    return returnStr
  }

}

Verwendungszweck:

"aouäöü!".urlPercentEncoded(withAllowedCharacters: .urlQueryAllowed,
                                         encoding: .isoLatin1) 
// Results in -> "aou%E4%F6%FC!"
0
2h4u

Hinzufügen zu Bryan Chens Antwort oben:

Nur für den Fall, dass jemand anderes etwas Ähnliches mit Alamofire bekommt:

fehler: Alamofire wurde mit Optimierung kompiliert - Stepping kann sich seltsam verhalten; Variablen sind möglicherweise nicht verfügbar.

Es ist kein sehr beschreibender Fehler. Ich habe diesen Fehler beim Erstellen einer URL für Google Geo Services erhalten. Ich habe eine Adresse an das Ende der URL angehängt, OHNE zuerst die Adresse selbst zu codieren. Ich konnte es mit Bryan Chens Lösung beheben:

var streetAdress = "123 fake street, new york, ny"
var escapedStreetAddress = streetAddress.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
let url = "\(self.baseUrl)&address=\(escapedAddress!)"

Das hat es für mich behoben! Es hat nicht gefallen, dass die Adresse Leerzeichen und Kommas usw. hatte.

Hoffe das hilft jemand anderem!

0
Geoherna