用AF太爽了 以至于原生的网络请求都不会写了,这让今天面试的我非常尴尬,恰逢首次搭建服务器完成,于是就写下原生求求搞搞事
URLRequest
请求类,包含一些请求的属性,包括请求头,请求体,请求路径等.对应OC中的NSURLReques
var request = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 30)
初始化一个请求对象 url不必说 cachePolicy是缓存策略,决定是否使用缓存,详细介绍->缓存策略 timeoutInterval表示超时时间
request.httpMethod = "POST"
设置请求方式,常用的就是GET和POST,其他方式并不常用,不列举了
request.setValue("text/html", forHTTPHeaderField: "Content-Type")
request.addValue("value", forHTTPHeaderField: "custom")
设置请求头或者添加一个请求头字段 字段详解
let str = "id=10&name=wangwuhua"
let data = str.data(using: .utf8)
request.httpBody = data
GET参数是在url中包含的,如果是POST就需要像上面那样设置请求体了
URLSession
会话类,负责网络通讯,包含请求,上传,下载三种通讯方式,对应OC的NSURLSession 通常使用它的单利对象就可以了
let request = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 30)
let session = URLSession.shared
let dataTask = session.dataTask(with: request) { (data, respons, error) in
print(error as Any)
if data == nil {return}
if respons == nil {return}
let str = String(data: data!, encoding: .utf8)
print(str as Any)
print(respons!)
}
dataTask.resume()
这是一个完整的GET请求dataTask是URLSessionTask的子类URLSessionDataTask的对象,请求不是自动开启的 需要手动调用dataTask.resume方法开启
URLSessionTask
管理请求生命周期的类,包含子类URLSessionDataTask
URLSessionUploadTask
URLSessionDownloadTask
URLSessionStreamTask
类 | 作用 | 父类 |
---|---|---|
URLSessionDataTask | 请求数据 | URLSessionTask |
URLSessionUploadTask | 上传数据 | URLSessionDataTask |
URLSessionDownloadTask | 下载数据 | URLSessionTask |
URLSessionStreamTask | tcp/upd长连接 | URLSessionTask |
URLSessionTask的主要作用就是管理会话的状态,主要方法有:
cancel: 取消本次会话
suspend: 暂停本次会话
resume: 开始或继续
state: 当前会话状态