Alamofire-Adapter适配器

2019-08-23  本文已影响0人  May_Dobin

Adapter源码分析

      SessionManager.default.request(urlStr, method: .get, parameters: ["username":"蓉儿","password":"888888"])
          .response { (response) in
              debugPrint(response)
          }
    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)
        }
    }
    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是什么时候赋值的?仔细查找发现对外开放了adapter属性:

    open var adapter: RequestAdapter?

全局参数header设置

class DDAdapter: RequestAdapter {
    func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
        var request = urlRequest
        request.setValue("3d335234sfirkjer34cv834d4gvx3", forHTTPHeaderField: "token")
       return request
    }
}
SessionManager.default.adapter = DDAdapter()
        SessionManager.default.request(urlStr, method: .get, parameters: ["username":"蓉儿","password":"888888"])
            .response { (response) in
                debugPrint(response)
            }

重定向

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
    }
}

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

上一篇 下一篇

猜你喜欢

热点阅读