如何在会话到期时处理API调用?

时间:2015-07-15 22:34:58

标签: javascript rest

我正在访问您首先授权的API,并且您将获得一个访问令牌,您可以在后续调用中使用它。在某个时间点(几小时后),访问令牌到期。所以我在服务器上缓存令牌,因此使用该Web应用程序的任何用户都将使用该令牌发起API调用。

但是当它到期时,我会在更新访问令牌后进行递归调用。所以,例如(在伪JS中):

function getDetails (id) {
  data = HTTP.get(url, {params: ...});

  if (!data.success) {
    updateToken(function () {
      return getDetails(id);
    });
  } else { /*.. we're good*/ }
}

那里也会有一个递归深度检查。如果有更好的方法来做到这一点,我很乐意听到它。基本上是:

  1. 调用API
  2. (失败)
  3. 更新令牌
  4. 再次调用API

2 个答案:

答案 0 :(得分:1)

这正是我如何设置的。但是,如果您可以访问promises(例如bluebirdbabel.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所有者决定因数据泄露等原因导致所有会话无效)。