【发布时间】:2019-10-22 11:13:09
【问题描述】:
我正在使用 Moya 库来处理网络层,并且我已经有一个自定义插件,可以将身份验证令牌添加到标头。
如果令牌尚不可用,我想做的是让这个插件取消请求并返回失败响应(或抛出错误)。
附:我扩展了协议TargetType 以添加额外的变量来指示目标是否需要身份验证,因此我需要访问这些数据以确定标头中是否需要身份验证令牌。
这是我的自定义插件的快照:
struct AuthTokenPlugin: PluginType {
let tokenClosure:()->String?
func prepare(_ request: URLRequest, target: TargetType) -> URLRequest {
guard let target = target as? AuthorizebleTargetType, target.needsAuth else {
return request
}
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.2:抛出错误不是一个好的做法,而且这是不可能的,因为封闭函数“prepare(_:target:)”未声明为“抛出”。
【问题讨论】:
-
为什么抛出错误不是一个好习惯?您可能更喜欢返回
Optional URLRequest。 -
不是一个好习惯,因为它在逻辑上是响应的正常失败,而不是常规逻辑的异常(如 JSON 解析错误)。
Optional URLRequest可能会解决这个问题,但它也是不可能的,因为它没有在 PluginType 协议中声明为可选