我正在访问您首先授权的API,并且您将获得一个访问令牌,您可以在后续调用中使用它。在某个时间点(几小时后),访问令牌到期。所以我在服务器上缓存令牌,因此使用该Web应用程序的任何用户都将使用该令牌发起API调用。
但是当它到期时,我会在更新访问令牌后进行递归调用。所以,例如(在伪JS中):
function getDetails (id) {
data = HTTP.get(url, {params: ...});
if (!data.success) {
updateToken(function () {
return getDetails(id);
});
} else { /*.. we're good*/ }
}
那里也会有一个递归深度检查。如果有更好的方法来做到这一点,我很乐意听到它。基本上是:
答案 0 :(得分:1)
这正是我如何设置的。但是,如果您可以访问promises(例如bluebird或babel.js),那么它在语法上会变得更好。这里的代码是用promises和es6重写的:
function getDetails (id) {
// the return is optional; return the promise if you want to chain to `getDetails`
return HTTP.get(URL, id, params)
.catch((err) => {
if (err.VALIDATION_ERROR) {
return updateToken().then(() => HTTP.get(URL, id, params))
} else {
throw err
}
}).then((yourRequest) => {
// data here
}).catch((err) => {
// handle fatal error
})
}
答案 1 :(得分:0)
最好的方法是保留一个计时器,因为你知道会话持续多长时间。那就是您可以在当前令牌/会话到期之前抢先要求新令牌。使用此方法还可确保您永远不会中断服务(除非您的新令牌请求失败)。除此之外,你似乎还有其他的。
当然,您仍然需要实现您向我们展示的代码来处理意外的会话过期(可能API所有者决定因数据泄露等原因导致所有会话无效)。