URLSession 创建
- 默认Session对象
let session = URLSession.shared
- 自定义配置对象
let config = URLSessionConfiguration.default
- 自定义Session对象
let session = URLSession(configuration: config)
- 代理商的自定义Session对象
let session = URLSession(configuration: config, delegate: self, delegateQueue: nil)
使用代理可以处理处理身份验证失败、重定向、进度更新等功能
URLSessionConfiguration
- URLSessionConfiguration 可以配置超时,缓存策略,请求头等
- 默认会话模式(default):默认模式,基于磁盘缓存的持久化策略,使用用户keychain中保存的证书进行认证授权。这个共享Cookie,缓存和证书,默认的shared的类型就是这个,只不过这个可以通过configuration进行更多配置,但是shared不支持其他的配置。
- 瞬时会话模式(ephemeral):不储存任何数据在磁盘中,所有数据都保存在内存中,当会话结束后,缓存数据将被清空。
- 后台会话模式(background):该模式类似于默认模式,只是将上传和下载移至后台处理,需要一个提供一个String类型的 identifier 用于标识后台会话。
- 超时
config.timeoutIntervalForRequest = 30
- 设置请求头
config.httpAdditionalHeaders = ["token" : "test"]
URLSessionTask
URLSessionTask是一个表示任务对象的抽象类,可以在URLSession的实例上调用调用对应的方法来创建任务,一共有四种任务类型:
- URLSessionDataTask:处理从HTTP get请求中从服务器获取数据到内存中
- URLSessionUploadTask:上传硬盘中的文件到服务器,一般是HTTP POST 或 PUT方式
- URLSessionDownloadTask:从远程服务器下载文件到临时文件位置
- URLSessionStreamTask:基于流的URL会话任务,提供了一个通过 URLSession 创建的 TCP/IP 连接接口
URLSessionDataTask
简单的get请求
guard let url = URL(string: "https://httpbin.org/get") else { return }
var request = URLRequest(url: url, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 30)
request.addValue("123456", forHTTPHeaderField: "test")
let session = URLSession.shared
let task = session.dataTask(with: request) { data, response, error in
guard error == nil else { return }
guard let httpResponse:HTTPURLResponse = response as? HTTPURLResponse else { return }
debugPrint("状态码 \(httpResponse.statusCode)")
guard let data = data else { return }
do {
let result = try JSONSerialization.jsonObject(with: data, options: .mutableContainers)
debugPrint(result)
} catch {
debugPrint("解析失败")
}
}
task.resume()
简单的post请求
guard let url = URL(string: "https://httpbin.org/post") else { return }
var request = URLRequest(url: url)
request.httpMethod = "POST"
let session = URLSession.shared
let task = session.dataTask(with: request) { data, response, error in
guard error == nil else { return }
guard let httpResponse:HTTPURLResponse = response as? HTTPURLResponse else { return }
debugPrint(httpResponse.statusCode)
guard let data = data else { return }
do {
let result = try JSONSerialization.jsonObject(with: data, options: .mutableContainers)
debugPrint(result)
} catch {
debugPrint("解析失败")
}
}
task.resume()
用代理的方式请求
guard let url = URL(string: "https://httpbin.org/get") else { return }
let request = URLRequest(url: url)
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config, delegate: self, delegateQueue: nil)
let task = session.dataTask(with: request)
task.resume()
- URLSessionDataDelegate
// 收到服务器响应
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) {
// 必须设置 allow 才能执行后续操作
completionHandler(.allow)
}
// 收到服务器数据
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
do {
let result = try JSONSerialization.jsonObject(with: data, options: .mutableContainers)
debugPrint(result)
} catch {
debugPrint("解析失败")
}
}
// 请求成功完成或失败
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
debugPrint("请求完成")
debugPrint(error?.localizedDescription ?? "")
}