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