我正在使用Moya库处理网络层,并且我已经有一个自定义插件,该插件将身份验证令牌添加到标头。
我想做的是让该插件取消请求并在令牌尚不可用时返回失败响应(或引发错误)。
这是我的自定义插件的快照:
struct AuthTokenPlugin: PluginType {
let tokenClosure:()->String?
func prepare(_ request: URLRequest, target: TargetType) -> URLRequest {
guard let token = tokenClosure() else {
// Here where a failure response will be triggered or an error should be thrown
return ......
}
var request = request
request.addValue( "Token " + token, forHTTPHeaderField:"Authorization")
return request
}
}
P.S。抛出错误不是一个好习惯,并且因为包含函数“ prepare(_:target :)”未声明为“ throws”,所以这是不可能的。
我不认为我们可以使用protocol TargetType
来实现这样的逻辑,因为他的方法不会返回Bool值并且不会被标记。
看看MoyaProvider
初始化参数。其中有一个requestClosure
参数。您可以复制粘贴此参数的默认实现,并将其替换为自己的实现,该实现将检查Endpoint
的授权标头。
此关闭的默认实现:
final class func defaultRequestMapping(for endpoint: Endpoint, closure: RequestResultClosure) {
do {
let urlRequest = try endpoint.urlRequest()
closure(.success(urlRequest))
} catch MoyaError.requestMapping(let url) {
closure(.failure(MoyaError.requestMapping(url)))
} catch MoyaError.parameterEncoding(let error) {
closure(.failure(MoyaError.parameterEncoding(error)))
} catch {
closure(.failure(MoyaError.underlying(error, nil)))
}
}