swift URL 编码

【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 = https://www.it610.com/article/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 = .reloadIgnoringLocalCacheDataURLSession.shared.dataTask(with: request, completionHandler: { (data, response, err) inif 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() } }

    推荐阅读