swift URL 编码

使用value.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? ""无法保证URL 编码成功,于是我参考 Alamofire 的URL编码如下:

static func get( _ url: String, parameters: [String: Any] , completionHandler: @escaping (NSError?, JSON) -> Void)  {

      var urlStr = url
      var flag = true
      let generalDelimitersToEncode = ":#[]@" // does not include "?" or "/" due to RFC 3986 - Section 3.4
      let subDelimitersToEncode = "!$&'()*+,;="
      var allowedCharacterSet = CharacterSet.urlQueryAllowed
      allowedCharacterSet.remove(charactersIn: "\(generalDelimitersToEncode)\(subDelimitersToEncode)")
      for ( key , value) in parameters {

         var anyValue: Any = value
         if let value = value as? String{

            anyValue = value.addingPercentEncoding(withAllowedCharacters: allowedCharacterSet) ?? ""
         }

         if flag{
            flag = false
            urlStr += "?" + key + "=\(anyValue)"
         }else{
            urlStr += "&" + key + "=\(anyValue)"
         }
      }
      if let url = URL.init(string: urlStr){
         var request = URLRequest(url: url)
         request.cachePolicy = .reloadIgnoringLocalCacheData

         URLSession.shared.dataTask(with: request, completionHandler: { (data, response, err) in

            if let err = err{

               completionHandler(err as NSError, JSON.null )
            }else{
// if let json = try? JSONSerialization.jsonObject(with: data!, options: [.allowFragments, .mutableContainers , .mutableLeaves]) as? [String: Any] {
               if let data = data {
                  let json = JSON.init(data: data)
                  guard let code = json["code"].int,
                     let msg = json["msg"].string else{
                        completionHandler(NSError(domain: "", code: 1, userInfo: nil), JSON.null)
                        return
                  }

                  if code  != 10000 {

                     completionHandler(NSError(domain: msg, code: code, userInfo: nil), JSON.null )
                  }else{

                     completionHandler(nil, json["data"])
                  }
               }
            }


         })
            .resume()
      }
   }
相关文章
相关标签/搜索