Swift

Swift:URLSession 的GET和POST

2017-06-03  本文已影响16人  一蓑丨烟雨

不啰嗦,直接上代码

import UIKit

class TYNet: NSObject {

    //单例
    static let share = TYNet()
    
    //GET请求
    func getWithParameter(url:String,paras:Dictionary<String,Any>?,success:@escaping ((_ result:Any)->()),failure:@escaping (_ error:Error)->()){
        var i = 0
        var address = url
        
        for (key,value) in paras! {
            if i == 0 {
                address += "?\(key)=\(value)"
            }else{
                address += "&\(key)=\(value)"
            }
            i += 1
        }
        let url = URL(string:address.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)!)
        let session = URLSession.shared
        let dataTask = session.dataTask(with: url!) { (data, response, error) in
            if let data = data{
                if let result = try? JSONSerialization.jsonObject(with: data, options: .allowFragments){
                    success(result)
                }
            }else{
                failure(error!)
            }
        }
        dataTask.resume()
    }
    
    //POST请求
    func postWithParameter(url:String,paras:Dictionary<String,Any>?,success:@escaping ((_ result:Any)->()),failure:@escaping (_ error:Error)->()){
        
        let url = URL(string: url)
        var request = URLRequest.init(url: url!)
        request.httpMethod = "POST"
        
//        let data3:Data = NSKeyedArchiver.archivedData(withRootObject: paras!) as Data

        //重点:设置body,处理参数
        request.httpBody = buildParams(paras!).data(using: .utf8)
        
        let session = URLSession.shared
        let dataTask = session.dataTask(with: request) { (data, respond, error) in
            
            if let data = data {
                
                if let result = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) {
                    
                    success(result)
                }
                
            }else {
                failure(error!)
            }
        }
        dataTask.resume()
    }
}

重点:处理参数的方法

//请求体,并处理特殊字符串 !$&'()*+,;= :#[]@
    private func buildParams(_ parameters: [String: Any]) -> String {
        var components: [(String, String)] = []
        
        for key in parameters.keys.sorted(by: <) {
            let value = parameters[key]!
            components += queryComponents(fromKey: key, value: value)
        }
        
        return components.map { "\($0)=\($1)" }.joined(separator: "&")
    }
    
    public func queryComponents(fromKey key: String, value: Any) -> [(String, String)] {
        var components: [(String, String)] = []
        
        if let dictionary = value as? [String: Any] {
            for (nestedKey, value) in dictionary {
                components += queryComponents(fromKey: "\(key)[\(nestedKey)]", value: value)
            }
        } else if let array = value as? [Any] {
            for value in array {
                components += queryComponents(fromKey: "\(key)[]", value: value)
            }
        } else if let value = value as? NSNumber {
            if value.boolValue {
                components.append((escape(key), escape((value.boolValue ? "1" : "0"))))
            } else {
                components.append((escape(key), escape("\(value)")))
            }
        } else if let bool = value as? Bool {
            components.append((escape(key), escape((bool ? "1" : "0"))))
        } else {
            components.append((escape(key), escape("\(value)")))
        }
        
        return components
    }

    public func escape(_ string: String) -> String {
        let generalDelimitersToEncode = ":#[]@" // does not include "?" or "/" due to RFC 3986 - Section 3.4
        let subDelimitersToEncode = "!$&'()*+,;="
        
        var allowedCharacterSet = CharacterSet.urlQueryAllowed
        allowedCharacterSet.remove(charactersIn: "\(generalDelimitersToEncode)\(subDelimitersToEncode)")
        
        return string.addingPercentEncoding(withAllowedCharacters: allowedCharacterSet) ?? string
    }
上一篇 下一篇

猜你喜欢

热点阅读