How do you implement a RequestAdapter in Alamofire 5?

Viewed 5064

In the Alamofire 5 Beta, SessionManager has been replaced by Session. I am wondering what the procedure is now for assigning a RequestAdapter, as this was a var in Alamofire 4, but in Alamofire 5 it's now a let constant. Hence the following code:

var session = Session()
session.adapter = AccessTokenAdapter

throws a compile-time error, "Cannot assign to property: 'adapter' is a 'let' constant"

The end goal is to set custom header fields such as JWT token.

4 Answers

You should conform to 'RequestInterceptor' protocol in your class, which have identical methods:

adapt and retry as in RequestAdapter and RequestRetrier.

Then you just pass it to request:

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

This is working for me in the latest 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))
    }

My solution:

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

Details

  • Xcode Version 11.3.1 (11C504)
  • Alamofire 5.0.4

Solution

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) {
        //....
    }
}
Related