Декодирование URL в iOS
Я использую Swift 1.2 для разработки приложения для iPhone и общаюсь с веб-службой http.
Я получаю ответ в формате строки запроса (пары ключ-значение) и URL, закодированный в .Net
.
Я могу получить ответ, но ищу правильный способ декодирования с помощью Swift.
Пример ответа следующий:
status=1&message=The+transaction+for+GBP+12.50+was+successful
Попробовал следующий способ декодирования и получения ответа сервера
// This provides encoded response String
var responseString = NSString(data: data, encoding: NSUTF8StringEncoding) as! String
var decodedResponse = responseString.stringByReplacingEscapesUsingEncoding(NSUTF8StringEncoding)!
Как заменить все экранированные символы URL в строке?
Ответы
Ответ 1
Для кодирования и декодирования URL создайте это расширение где-нибудь в проекте:
Swift 2.0
extension String
{
func encodeUrl() -> String
{
return self.stringByAddingPercentEncodingWithAllowedCharacters( NSCharacterSet.URLQueryAllowedCharacterSet())
}
func decodeUrl() -> String
{
return self.stringByRemovingPercentEncoding
}
}
Swift 3.0
extension String
{
func encodeUrl() -> String
{
return self.addingPercentEncoding( withAllowedCharacters: NSCharacterSet.urlQueryAllowed())
}
func decodeUrl() -> String
{
return self.removingPercentEncoding
}
}
Swift 4.1
extension String
{
func encodeUrl() -> String?
{
return self.addingPercentEncoding( withAllowedCharacters: NSCharacterSet.urlQueryAllowed)
}
func decodeUrl() -> String?
{
return self.removingPercentEncoding
}
}
Ответ 2
Swift 2 и более поздние версии (xCode 7)
var s = "aa bb -[:/?&=;[email protected]#$()',*]";
let sEncode = s.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())
let sDecode = sEncode?.stringByRemovingPercentEncoding
Ответ 3
Метод stringByReplacingEscapesUsingEncoding
ведет себя корректно. Символ "+"
не является частью процентного кодирования. Этот сервер использует его неправильно; он должен использовать здесь пространство с процентами (%20
). Если для определенного ответа вам нужны пробелы, где вы видите символы "+"
, вам просто нужно обойти поведение сервера, выполнив подстановку самостоятельно, как вы уже делаете.
Ответ 4
В моем случае мне нужен сигнал "плюс" ( "+" ) в телефонном номере в параметрах строки запроса, например "+55 11 99999-5555". После того, как я обнаружил, что кодировщик swift3 (xcode 8.2) не кодирует "+" как сигнал плюс, но я должен был обратиться к обходному решению после кодирования:
Swift 3.0
_strURL = _strURL.replacingOccurrences(of: "+", with: "%2B")
Ответ 5
В Swift 3
extension URL {
var parseQueryString: [String: String] {
var results = [String: String]()
if let pairs = self.query?.components(separatedBy: "&"), pairs.count > 0 {
for pair: String in pairs {
if let keyValue = pair.components(separatedBy: "=") as [String]? {
results.updateValue(keyValue[1], forKey: keyValue[0])
}
}
}
return results
}
}
в вашем коде для доступа ниже
let parse = url.parseQueryString
print("parse \(parse)" )
Ответ 6
Лучше использовать встроенную структуру URLComponents
, поскольку она соблюдает надлежащие правила.
extension URL
{
var parameters: [String: String?]?
{
if let components = URLComponents(url: self, resolvingAgainstBaseURL: false),
let queryItems = components.queryItems
{
var parameters = [String: String?]()
for item in queryItems {
parameters[item.name] = item.value
}
return parameters
} else {
return nil
}
}
}