Подтвердить что ты не робот

Декодирование 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 в строке?

4b9b3361

Ответ 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
        }
    }
}