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
}