Как использовать stringByAddingPercentEncodingWithallowedcharacters() для URL-адреса в Swift 2.0
я использовал это в Swift 1.2
let urlwithPercentEscapes = myurlstring.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
теперь это дает мне предупреждение с просьбой использовать
stringByAddingPercentEncodingWithAllowedCharacters
мне нужно использовать NSCharacterSet в качестве аргумента, но их так много, и я не могу определить, какой из них даст мне тот же результат, что и ранее используемый метод.
пример URL, который я хочу использовать, будет выглядеть так
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
набор символов URL для кодирования, похоже, содержит наборы обрезки мой URL-АДРЕС. я.е
компонент пути URL-адреса является компонентом, непосредственно следующим за компонент хоста (если присутствует). Он заканчивается везде, где запрос или фрагмент компонент начинается. Например, в URL-адресе http://www.example.com/index.php?key1=value1, компонент пути /индекс.РНР.
однако я не хочу обрезать какой-либо аспект этого.
Когда я использовал свою строку, например myurlstring
это было ошибкой.
но при использовании после этого не было никаких проблем. Он закодировал строку с некоторой магией, и я мог получить свои данные URL.
let urlwithPercentEscapes = myurlstring.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
как
возвращает представление строки с использованием заданной кодировки для определите процент экранирования, необходимый для преобразования строки в a юридическая строка URL
спасибо
6 ответов:
для данной строки URL эквивалент
let urlwithPercentEscapes = myurlstring.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
- это набор символов
URLQueryAllowedCharacterSet
let urlwithPercentEscapes = myurlstring.stringByAddingPercentEncodingWithAllowedCharacters( NSCharacterSet.URLQueryAllowedCharacterSet())
Swift 3:
let urlwithPercentEscapes = myurlstring.addingPercentEncoding( withAllowedCharacters: .urlQueryAllowed)
он кодирует все после вопросительного знака в строке URL.
так как метод
stringByAddingPercentEncodingWithAllowedCharacters
может вернуть nil, использовать дополнительные привязки, как предложено в ответе Лео Дабуса.
это будет зависеть от вашего адреса. Если Ваш url-это путь, вы можете использовать набор символов urlPathAllowed
let myFileString = "My File.txt" if let urlwithPercentEscapes = myFileString.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) { print(urlwithPercentEscapes) // "My%20File.txt" }
создание набора символов для кодировки URL
urlFragmentAllowed
urlHostAllowed
urlPasswordAllowed
urlQueryAllowed
urlUserAllowed
вы также можете создать свой собственный символ 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" }
другой вариант:используйте url-компоненты, чтобы правильно создать свой url
Swift 3.0 (от grokswift)
создание URL-адресов из строк-это минное поле для ошибок. Просто пропустите один / или случайно URL кодировать ? в запросе и вызове API произойдет сбой, и ваше приложение не будет отображать никаких данных (или даже сбой, если вы не ожидали такой возможности). С iOS 8 есть лучший способ построить URL-адреса с помощью
NSURLComponents
и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 }
Ниже приведен код для доступа к url с помощью
guard
заявление.guard let url = createURLWithComponents() else { print("invalid URL") return nil } print(url)
выход:
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
в моем случае, когда последний компонент не был латинскими символами, я сделал следующее в 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 { == "/" }.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() }.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 3.1, я использую что-то вроде следующего:
let query = "param1=value1¶m2=" + valueToEncode.addingPercentEncoding(withAllowedCharacters: .alphanumeric)
это безопаснее, чем .urlQueryAllowed и другие, потому что это будет кодировать все символы, кроме A-Z, a-z и 0-9. Это работает лучше, когда значение, которое вы кодируете, может использовать специальные символы, такие как ?,&,=, + и пробелы.