Alamofire中RequestInterceptor未被调用、adapt方法不执行如何解决?
问题原因及可行解决方案
可能原因
- 拦截器
adapt方法签名与Alamofire协议要求不匹配:你自定义了AdapterResult类型别名,可能导致方法重载没有被Alamofire正确识别,无法触发对应实现。 - 调用的Session实例异常:存在误用Alamofire默认
AF.request发起请求的情况,没有实际用到你配置了拦截器的自定义sessionManager实例。 URLRequestConvertible实现异常:你传入的route实例在执行asURLRequest()方法时抛出错误,Alamofire会直接返回错误结果,不会进入拦截器的adapt流程。- 缓存机制绕过拦截:如果请求命中了本地缓存且满足缓存生效规则,部分场景下不会触发拦截器逻辑。
解决方案
- 修正拦截器方法签名,删除自定义的
AdapterResult类型别名,直接使用Alamofire协议要求的标准实现:
import Alamofire class APIRequestInterceptor: RequestInterceptor { let retryLimit = 5 let retryDelay: TimeInterval = 10 func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) { var urlRequest = urlRequest debugPrint("In the request interceptor...") debugPrint(urlRequest) if let token = Globals.sharedInstance.token { urlRequest.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization") } completion(.success(urlRequest)) } func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) { let response = request.task?.response as? HTTPURLResponse //Retry for 5xx status codes if let statusCode = response?.statusCode, (500...599).contains(statusCode), request.retryCount < retryLimit { completion(.retryWithDelay(retryDelay)) } else { return completion(.doNotRetry) } } }
- 全局排查请求发起代码,确认所有网络请求都调用你自定义的
sessionManager.request方法,没有混用默认的AF.request。 - 排查
URLRequestConvertible实现,在asURLRequest()方法中加断点或打印,确认方法正常返回URLRequest实例,没有抛出错误。 - 先使用最简单的原生字符串地址发起测试请求,确认拦截器是否正常触发,快速定位问题范围:
sessionManager.request("https://example.com").response { _ in }
如果该测试请求能触发adapt内部断点,说明问题出在你的URLRequestConvertible实现上;如果仍然无法触发,再排查Session实例的配置是否存在其他覆盖项。
内容的提问来源于stack exchange,提问作者DevinM
相关产品推荐
相关产品推荐

