您如何在Alamofire 5中实现RequestAdapter?

时间:2019-01-16 22:29:50

标签: alamofire

在Alamofire 5 Beta中,SessionManager已替换为Session。 我想知道现在分配RequestAdapter的过程是什么,因为在Alamofire 4中这是一个var,但是在Alamofire 5中它现在是一个let常量。因此,下面的代码:

var session = Session()
session.adapter = AccessTokenAdapter

引发编译时错误,“无法分配给属性:'adapter'是'let'常量”

最终目标是设置自定义标头字段,例如JWT令牌。

4 个答案:

答案 0 :(得分:1)

这在最新的Alamofire中为我工作

func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (AFResult<URLRequest>) -> Void) {
        var modifiedURLRequest = urlRequest
        modifiedURLRequest.setValue("Bearer " + accessToken, forHTTPHeaderField: "Authorization")
        completion(.success(urlRequest))
    }

答案 1 :(得分:0)

您应遵循类中的“ RequestInterceptor ”协议,该协议具有相同的方法:

adapt 重试,如 RequestAdapter RequestRetrier 一样。

然后您将其传递给请求

AF.request(urlRequest, interceptor: RequestInterceptor? = nil)

答案 2 :(得分:0)

我的解决方案:

import Foundation
import Alamofire

class AFAuth {

    public static let session : Session = {
        let session = Session(interceptor: AuthRequestInterceptor())
        return session
    }()

    @discardableResult
    public static func request(_ urlRequest: URLRequestConvertible) -> DataRequest {
        return AFAuth.session.request(urlRequest)
    }
}

答案 3 :(得分:0)

详细信息

  • Xcode版本11.3.1(11C504)
  • Alamofire 5.0.4

解决方案

class ConnectionService {
    private var session: Session!

    init() {
        let config = Session.default.session.configuration
        session = Session(configuration: config, interceptor: self)
    }
}

extension ConnectionService: RequestInterceptor {

    func adapt(_ urlRequest: URLRequest, for session: Session,
               completion: @escaping (Result<URLRequest, Error>) -> Void) {
        //....
    }
}