用AF太爽了 以至于原生的網(wǎng)絡(luò)請求都不會寫了,這讓今天面試的我非常尷尬,恰逢首次搭建服務(wù)器完成,于是就寫下原生求求搞搞事
URLRequest
請求類,包含一些請求的屬性,包括請求頭,請求體,請求路徑等.對應(yīng)OC中的NSURLReques
var request = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 30)
初始化一個請求對象 url不必說 cachePolicy是緩存策略,決定是否使用緩存,詳細(xì)介紹->緩存策略 timeoutInterval表示超時時間
request.httpMethod = "POST"
設(shè)置請求方式,常用的就是GET和POST,其他方式并不常用,不列舉了
request.setValue("text/html", forHTTPHeaderField: "Content-Type")
request.addValue("value", forHTTPHeaderField: "custom")
設(shè)置請求頭或者添加一個請求頭字段 字段詳解
let str = "id=10&name=wangwuhua"
let data = str.data(using: .utf8)
request.httpBody = data
GET參數(shù)是在url中包含的,如果是POST就需要像上面那樣設(shè)置請求體了
URLSession
會話類,負(fù)責(zé)網(wǎng)絡(luò)通訊,包含請求,上傳,下載三種通訊方式,對應(yīng)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的對象,請求不是自動開啟的 需要手動調(diào)用dataTask.resume方法開啟
URLSessionTask
管理請求生命周期的類,包含子類URLSessionDataTask
URLSessionUploadTask
URLSessionDownloadTask
URLSessionStreamTask
類 | 作用 | 父類 |
---|---|---|
URLSessionDataTask | 請求數(shù)據(jù) | URLSessionTask |
URLSessionUploadTask | 上傳數(shù)據(jù) | URLSessionDataTask |
URLSessionDownloadTask | 下載數(shù)據(jù) | URLSessionTask |
URLSessionStreamTask | tcp/upd長連接 | URLSessionTask |
URLSessionTask的主要作用就是管理會話的狀態(tài),主要方法有:
cancel: 取消本次會話
suspend: 暫停本次會話
resume: 開始或繼續(xù)
state: 當(dāng)前會話狀態(tài)