美文网首页
Alamofire-Adapter适配器

Alamofire-Adapter适配器

作者: May_Dobin | 来源:发表于2019-08-23 11:16 被阅读0次

Adapter源码分析

  • 在实际开发过程中,我们经常需要在header中添加token的需求,以及非法域名的拦截,接下来就看看Alamofire中应该如何处理?
  • 首先发起一个网络请求:
      SessionManager.default.request(urlStr, method: .get, parameters: ["username":"蓉儿","password":"888888"])
          .response { (response) in
              debugPrint(response)
          }
  • 源码分析可知,在发起请求的时候,用到了一个adapter参数:
    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)
            }
        }
    }
  • 继续跟进:
    func adapt(using adapter: RequestAdapter?) throws -> URLRequest {
        guard let adapter = adapter else { return self }
        return try adapter.adapt(self)
    }
  • 判断adapter如果存在,调用自己;不存在就返回self。是不是想到了什么?

我们可以通过它,对所有网络请求添加全局参数
可以做重定向
此时有新问题了,在发起请求时,初始化方法并没有这个参数,那么adapter是什么时候赋值的?仔细查找发现对外开放了adapter属性:

    open var adapter: RequestAdapter?

全局参数header设置

  • 我们自定义一个RequestAdapter,注意传入的urlRequest是不可变,所以要var一个新变量再返回:
class DDAdapter: RequestAdapter {
    func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
        var request = urlRequest
        request.setValue("3d335234sfirkjer34cv834d4gvx3", forHTTPHeaderField: "token")
       return request
    }
}
  • 在封装的网络基类,设置adapter,就实现了全局header中添加参数:
SessionManager.default.adapter = DDAdapter()
        SessionManager.default.request(urlStr, method: .get, parameters: ["username":"蓉儿","password":"888888"])
            .response { (response) in
                debugPrint(response)
            }

重定向

  • header设置,只是需要稍微做下手脚,
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就进行重定向,做额外进行处理,实现了非法域名的拦截!

以上就是Adapter的两种用法,
request设置header
request重定向

相关文章

  • Alamofire-Adapter适配器

    Adapter源码分析 在实际开发过程中,我们经常需要在header中添加token的需求,以及非法域名的拦截,接...

  • 【设计模式】适配器模式

    学习文章 iOS设计模式 - 适配器 适配器模式(Adapter):类适配器、对象适配器 类图 说明 类适配器: ...

  • ListView常用知识点归纳

    适配器 适配器实现过程:共3步:新建适配器-->添加数据源到适配器-->视图加载适配器 适配器的数据源:Array...

  • iOS设计模式 (五) 适配器模式

    适配器模式 iOS中的适配器模式,主要由目标协议,适配者,适配器三部分组成. 适配器模式分类 类适配器: 适配器是...

  • 设计模式-适配器

    适配器模式,目的是为了适配补偿,对于适配器模式,我们要学习的两种方式是类适配器和对象适配器。 类适配器 类适配器是...

  • Java设计模式(二)

    talk is cheap show me the code 适配器模式 类适配器模式 接口适配器模式 对象适配器...

  • 适配器模式

    目录 1、什么是适配器模式? 2、适配器模式结构? 3、如何实现适配器模式? 4、适配器模式的特点? 5、适配器模...

  • 适配器模式

    先直观感受下什么叫适配器 适配器模式有类的适配器模式和对象的适配器模式两种不同的形式。 类适配器模式 对象适配器模...

  • iOS 适配器模式

    适配器模式创建适配协议,创建抽象适配器类,创建类适配器/对象适配器。 应用,适用场景电源适配器,普通充电器(类适配...

  • 适配器模式

    对象适配器目标类--继承或引用<---适配器--->关联---适配者 类适配器目标类--继承或引用<---适配器-...

网友评论

      本文标题:Alamofire-Adapter适配器

      本文链接:https://www.haomeiwen.com/subject/tvfzsctx.html