Кодировка URL в месте быстрого преобразования в% 20, а затем в% 20 в% 2520 - PullRequest
0 голосов
/ 29 апреля 2020

Вот код

struct URLParameterEncoder: ParameterEncoderProtocol {

    /// Takes dictionary parameters and encode them to make them safe to be passed as URLQueryItem in the URLRequest
    func encode(urlRequest: inout URLRequest, with parameters: Parameters) throws {

        guard let url = urlRequest.url else {throw ParameterEncoderError.missingURL}

        //Only execute if there are parameters to encode
        if var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false), !parameters.isEmpty {

            urlComponents.queryItems = [URLQueryItem]()

            for (key,value) in parameters {
                let queryItem = URLQueryItem(name: key, value: "\(value)".addingPercentEncoding(withAllowedCharacters: .urlHostAllowed))

                urlComponents.queryItems?.append(queryItem)
            }

            printLog("url before query items ", urlRequest.url!)

            urlRequest.url = urlComponents.url
        }
    }


}

Хотя URLItem дает правильный вывод. Но когда он добавляется к компоненту URL, он дает такой результат.

https://xxxxxxxxx.net/api/v1/merchant/list?q=filter&showRPPS=true&industry=insurance%2520sys
 - scheme : “https”
 - host : “xxxxxxxxx.net”
 - path : “/api/v1/merchant/list”
 ▿ queryItems : 3 elements
  ▿ 0 : q=filter
   - name : “q”
   ▿ value : Optional<String>
    - some : “filter”
  ▿ 1 : showRPPS=true
   - name : “showRPPS”
   ▿ value : Optional<String>
    - some : “true”
  ▿ 2 : industry=insurance%20sys
   - name : “industry”
   ▿ value : Optional<String>
    - some : “insurance%20sys”

Обязательно: https://xxxxxxxxx.net/api/v1/merchant/list?q=filter&showRPPS=true&industry=insurance%20sys

Факт: https://xxxxxxxxx.net/api/v1/merchant/list?q=filter&showRPPS=true&industry=insurance%2520sys

1 Ответ

2 голосов
/ 29 апреля 2020

URLComponents добавляет процентное кодирование к своим компонентам при необходимости. Вы не должны добавлять процентные кодировки вручную.

            for (key,value) in parameters {
                let queryItem = URLQueryItem(name: key, value: String(describing: value))

                urlComponents.queryItems?.append(queryItem)
            }
...