swift URL 编码

来源:互联网 发布:海信网络电视价格 编辑:程序博客网 时间:2024/06/05 07:14

使用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()      }   }