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,JSON.null )
                  }else{

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


         })
            .resume()
      }
   }

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...