Alamofire-Adapter適配器

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重定向

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市局扶,隨后出現(xiàn)的幾起案子恨统,更是在濱河造成了極大的恐慌,老刑警劉巖三妈,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畜埋,死亡現(xiàn)場離奇詭異,居然都是意外死亡畴蒲,警方通過查閱死者的電腦和手機(jī)悠鞍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來模燥,“玉大人咖祭,你說我怎么就攤上這事〗е希” “怎么了心肪?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纠吴。 經(jīng)常有香客問我硬鞍,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任固该,我火速辦了婚禮锅减,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘伐坏。我一直安慰自己怔匣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布桦沉。 她就那樣靜靜地躺著每瞒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纯露。 梳的紋絲不亂的頭發(fā)上剿骨,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音埠褪,去河邊找鬼浓利。 笑死,一個(gè)胖子當(dāng)著我的面吹牛钞速,可吹牛的內(nèi)容都是我干的贷掖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼渴语,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼苹威!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起遵班,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤屠升,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后狭郑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腹暖,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年翰萨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了脏答。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亩鬼,死狀恐怖殖告,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雳锋,我是刑警寧澤黄绩,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站玷过,受9級(jí)特大地震影響爽丹,放射性物質(zhì)發(fā)生泄漏筑煮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一粤蝎、第九天 我趴在偏房一處隱蔽的房頂上張望真仲。 院中可真熱鬧,春花似錦初澎、人聲如沸秸应。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽软啼。三九已至,卻和暖如春延柠,著一層夾襖步出監(jiān)牢的瞬間焰宣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國打工捕仔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盈罐。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓榜跌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親盅粪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钓葫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356