Swift encode & в параметре GET

У меня есть простой запрос GET для входа. Имя пользователя Silver, а пароль – MOto & @ 10
Я использую среду SwiftHttp для обработки запросов. При попадании запроса на вход я всегда получаю ответ как ложный.
Однако при попадании URL-адреса запроса на вход в браузер (заменил фактический домен на сервер), я верю:
HTTPS: // сервер / API / проверки доступа / по-логин миновать _key = wlyOF7TM8Y3tn19KUdlq & Войти = серебро и передать = MOTO% 26 @ 10

Что-то не так с кодировкой и паролем. Хотя я заменил его процентной кодировкой. Вот мой код:

do { let passwordString = self.convertSpecialCharacters(string: password.text!) print("%@", passwordString) let opt = try HTTP.GET(Constants.kLoginUrl, parameters: ["login": username.text!, "pass": passwordString]) opt.start { response in if let err = response.error { print("error: \(err.localizedDescription)") return } print("opt finished: \(response.description)") self.parseLoginResponse(response.data) } } catch _ as NSError { } 

И это convertSpecialCharacters :

 func convertSpecialCharacters(string: String) -> String { var newString = string let arrayEncode = ["&", "<", ">", "\"", "'", "-", "..."] for (escaped_char) in arrayEncode { newString = newString.encode(escaped_char) } return newString } 

Расширение для кодирования:

 extension String { func encode(_ chars: String) -> String { let forbidden = CharacterSet(charactersIn: chars) return self.addingPercentEncoding(withAllowedCharacters: forbidden.inverted) ?? self } } 

    Подходящим способом является использование URLComponents который обрабатывает всю процентную кодировку:

     var urlComponents = URLComponents(string: "https://server/api/check-access/by-login-pass")! let queryItems = [URLQueryItem(name:"_key", value:"wlyOF7TM8Y3tn19KUdlq"), URLQueryItem(name:"login", value:"silver"), URLQueryItem(name:"pass", value:"MOto&@10")] urlComponents.queryItems = queryItems let url = urlComponents.url print(url) // "https://server/api/check-access/by-login-pass?_key=wlyOF7TM8Y3tn19KUdlq&login=silver&pass=MOto%[email protected]" 

    PS: Я полностью согласен с комментарием luk2302.

    Я решил пойти полным обычаем для моего запроса GET, поскольку все остальное не хотело работать и злилось. Я использовал запрос на что-то другое, как, например, получить список с нашего сервера. Вход выполняется через запросы POST, что было проще.

    Однако, чтобы придерживаться GET-запросов: мне нужны были такие символы, как «+» и «/». Сначала я не смог получить «+», закодированный с помощью метода «stringByAddingPercentEncodingWithAllowedCharacters». Поэтому я построил собственное расширение для String:

     extension String { return CFURLCreateStringByAddingPercentEscapes( nil, self as CFString, nil, "!*'();:@&=+$,/?%#[]" as CFString, CFStringBuiltInEncodings.UTF8.rawValue ) as String } 

    Второй шаг должен был добавить это к моему URL для окончательного запроса. Я хотел использовать URLQueryItems и добавлять их в url, используя url.query или url.queryItems. Плохой сюрприз: моя уже правильно закодированная строка снова закодирована, и каждый «%» внутри нее стал «% 25», что делает его недействительным. -.-

    Итак, теперь я добавил каждое закодированное значение в строку, которая будет добавлена ​​к URL-адресу. Не чувствует себя очень «быстрым», но нормально ..

     let someUrl = "https://example.com/bla/bla.json" var queryString = "" var index = 0 // dicParam is of type [String: AnyObject] with all needed keys and values for the query for (key, value) in dicParam { let encodedValue = (value as! String).encodeUrl() if index != 0 { queryString.append("&\(key)=\(encodedValue)") } else { queryString.append("?\(key)=\(encodedValue)") } index += 1 } let url = URLComponents(string: someUrl + queryString)! 

    Надеюсь, это поможет кому-то и сэкономит несколько часов: /

    Interesting Posts

    Есть ли у iOS бюджет для удаленных push-уведомлений?

    Попытка обнаружить «прикоснуться» к UIImageView, который не был задействован

    Почему я не могу уволить контроллер просмотра, который я загрузил?

    Не удалось выполнить запрос геокодирования google google

    Загрузка SKScene без содержимого и соответствующего цвета фона

    Как сделать NSSortDescriptor для работы с массивом?

    PaintCode 2 с UIButtons в раскадровке

    Боковые скользящие вкладки в приложении iPhone / iPad

    Получите информацию о частоте сердечных сокращений от часов Apple, чтобы спарить iPhone

    Беспроводное распределение приложений iPhone – как защитить файл .ipa?

    По умолчанию открываются фигурные скобки в Xcode

    Где я должен создать собственный класс в контроллере view в Objective-C?

    Swift: возможно ли установить другой цвет для одного символа в UILabel?

    Почему AVPlayer не останавливается на последнем кадре потокового видео HLS?

    Почему ограничение UIViewController.UIView на дочерний UIViewLabel выдает ошибку «Недопустимое сопряжение атрибутов макета»?

    Давайте будем гением компьютера.