Adapter源碼分析
- 在實(shí)際開發(fā)過程中子眶,我們經(jīng)常需要在
header
中添加token
的需求溯壶,以及非法域名的攔截冗恨,接下來就看看Alamofire
中應(yīng)該如何處理弦赖? - 首先發(fā)起一個(gè)網(wǎng)絡(luò)請(qǐng)求:
SessionManager.default.request(urlStr, method: .get, parameters: ["username":"蓉兒","password":"888888"])
.response { (response) in
debugPrint(response)
}
- 源碼分析可知戚哎,在發(fā)起請(qǐng)求的時(shí)候,用到了一個(gè)
adapter
參數(shù):
open func request(_ urlRequest: URLRequestConvertible) -> DataRequest {
var originalRequest: URLRequest?
do {
originalRequest = try urlRequest.asURLRequest()
let originalTask = DataRequest.Requestable(urlRequest: originalRequest!)
let task = try originalTask.task(session: session, adapter: adapter, queue: queue)
let request = DataRequest(session: session, requestTask: .data(originalTask, task))
delegate[task] = request
if startRequestsImmediately { request.resume() }
return request
} catch {
return request(originalRequest, failedWith: error)
}
}
- 那么
adapter
到底做了什么嫂用?
struct Requestable: TaskConvertible {
let urlRequest: URLRequest
func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) throws -> URLSessionTask {
do {
let urlRequest = try self.urlRequest.adapt(using: adapter)
return queue.sync { session.dataTask(with: urlRequest) }
} catch {
throw AdaptError(error: error)
}
}
}
- 繼續(xù)跟進(jìn):
func adapt(using adapter: RequestAdapter?) throws -> URLRequest {
guard let adapter = adapter else { return self }
return try adapter.adapt(self)
}
- 判斷
adapter
如果存在型凳,調(diào)用自己;不存在就返回self
尸折。是不是想到了什么啰脚?
我們可以通過它,對(duì)所有網(wǎng)絡(luò)請(qǐng)求添加全局參數(shù)
可以做重定向
此時(shí)有新問題了实夹,在發(fā)起請(qǐng)求時(shí),初始化方法并沒有這個(gè)參數(shù)粒梦,那么adapter
是什么時(shí)候賦值的亮航?仔細(xì)查找發(fā)現(xiàn)對(duì)外開放了adapter
屬性:
open var adapter: RequestAdapter?
全局參數(shù)header
設(shè)置
- 我們自定義一個(gè)
RequestAdapter
,注意傳入的urlRequest
是不可變,所以要var
一個(gè)新變量再返回:
class DDAdapter: RequestAdapter {
func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
var request = urlRequest
request.setValue("3d335234sfirkjer34cv834d4gvx3", forHTTPHeaderField: "token")
return request
}
}
- 在封裝的網(wǎng)絡(luò)基類匀们,設(shè)置
adapter
缴淋,就實(shí)現(xiàn)了全局header
中添加參數(shù):
SessionManager.default.adapter = DDAdapter()
SessionManager.default.request(urlStr, method: .get, parameters: ["username":"蓉兒","password":"888888"])
.response { (response) in
debugPrint(response)
}
重定向
- 同
header
設(shè)置,只是需要稍微做下手腳泄朴,
class DDAdapter: RequestAdapter {
func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
var request = urlRequest
request.setValue("3d335234sfirkjer34cv834d4gvx3", forHTTPHeaderField: "token")
if (!(request.url!.absoluteString.contains("www.test.com"))) {
print("非法URL")
let newUrlRequest = URLRequest.init(url: URL(string: "http://www.baidu.com")!)
return newUrlRequest
}
return request
}
}
- 如果符合條件
www.test.com
就進(jìn)行重定向重抖,做額外進(jìn)行處理,實(shí)現(xiàn)了非法域名的攔截祖灰!
以上就是
Adapter
的兩種用法钟沛,
request
設(shè)置header
request
重定向