URLSession (一)基本get post请求

819 阅读2分钟

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 可以配置超时,缓存策略,请求头等
  1. 默认会话模式(default):默认模式,基于磁盘缓存的持久化策略,使用用户keychain中保存的证书进行认证授权。这个共享Cookie,缓存和证书,默认的shared的类型就是这个,只不过这个可以通过configuration进行更多配置,但是shared不支持其他的配置。
  1. 瞬时会话模式(ephemeral):不储存任何数据在磁盘中,所有数据都保存在内存中,当会话结束后,缓存数据将被清空。
  2. 后台会话模式(background):该模式类似于默认模式,只是将上传和下载移至后台处理,需要一个提供一个String类型的 identifier 用于标识后台会话。
  • 超时
config.timeoutIntervalForRequest = 30
  • 设置请求头
config.httpAdditionalHeaders = ["token" : "test"]

URLSessionTask

URLSessionTask是一个表示任务对象的抽象类,可以在URLSession的实例上调用调用对应的方法来创建任务,一共有四种任务类型:

  1. URLSessionDataTask:处理从HTTP get请求中从服务器获取数据到内存中
  2. URLSessionUploadTask:上传硬盘中的文件到服务器,一般是HTTP POST 或 PUT方式
  3. URLSessionDownloadTask:从远程服务器下载文件到临时文件位置
  4. 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 ?? "")
}