Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 会话过期时如何处理API调用?_Javascript_Rest - Fatal编程技术网

Javascript 会话过期时如何处理API调用?

Javascript 会话过期时如何处理API调用?,javascript,rest,Javascript,Rest,我正在访问一个API,在这里您首先授权,然后您将获得一个访问令牌,您可以在后续调用中使用它。在某个时间点(数小时后),访问令牌过期。因此,我正在服务器上缓存令牌,以便任何使用web应用程序的用户都将使用该令牌启动API调用 但当它过期时,我会在更新访问令牌后执行递归调用。例如,在pseudo JS中: 这里也会有一个递归深度检查。如果有更好的方法,我很想听听。基本上: 调用API (失败) 更新令牌 再次调用API 这正是我设置它的方式。然而,如果你有机会获得承诺(例如,或),它在语法上会变得更

我正在访问一个API,在这里您首先授权,然后您将获得一个访问令牌,您可以在后续调用中使用它。在某个时间点(数小时后),访问令牌过期。因此,我正在服务器上缓存令牌,以便任何使用web应用程序的用户都将使用该令牌启动API调用

但当它过期时,我会在更新访问令牌后执行递归调用。例如,在pseudo JS中:

这里也会有一个递归深度检查。如果有更好的方法,我很想听听。基本上:

  • 调用API
  • (失败)
  • 更新令牌
  • 再次调用API

  • 这正是我设置它的方式。然而,如果你有机会获得承诺(例如,或),它在语法上会变得更好。下面是用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
        })
    }
    

    最好的方法是保持一个计时器,因为你知道会话持续多长时间。也就是说,您可以在当前令牌/会话到期之前先发制人地请求一个新令牌。使用此方法还可以确保服务不会中断(当然,除非您对新令牌的请求失败)。除此之外,其余的似乎都在你手上


    当然,您仍然需要实现您向我们展示的代码来处理意外的会话过期(可能API所有者因为数据泄露等原因决定使所有会话无效)。

    如果他们没有使用API的权限,会发生什么?您的函数会导致堆栈溢出吗?(也许您应该只执行一次递归。)我知道您在那里做了什么!;)为了便于讨论,让我们假设他们得到了许可。原始访问令牌有效,因为Node.js服务器使用密钥/密码授权。是的,我的递归检查器只允许一个级别的递归。我也必须像这样使用api,reddit的api。基本上,根据api发出的消息,如果有错误,您将检查错误是什么,如果是您没有进行身份验证,最终会发生这种情况,您将请求新令牌并将现有令牌更新为新令牌,然后从您停止的位置继续。所以你的想法是对的,我不认为还有其他方式可以设计API。@MuhammadUmer是的,我想问的是“从你离开的地方继续”部分。如果令牌在某一点有效,那么它将过期,我们必须获得一个新的令牌,然后再次尝试刚刚失败的API调用。我只是想知道是否有比递归更好或更干净的方法。我喜欢这个想法。但不幸的是,我并不总是知道会话超时。即使我这样做了,如果我重新启动Node.js服务器并重新授权,它仍然会返回相同的令牌(就像Salesforce一样),那么服务器将不知道到期时间。你怎么可能不知道超时时间?除非API代码不断变化,否则会话长度应该保持相当恒定。如果服务器重新启动,您可以在默认情况下请求新令牌,而不是使用旧令牌。我怎么会不知道超时时间?比如,糟糕的API文档。嗯,那总是很糟糕。您是否检查了成功验证返回的响应/标题?他们可能会在那里的某个地方给你会话信息。很好!我正在使用Meteor,所以我可以添加Babel包以获得ES6支持。我不知道为什么我可以再次调用
    HTTP.get
    。但请注意,原始代码中的
    return getDetails(id)
    不起作用,因为它会将结果返回给传递给
    updateToken
    的匿名函数。罪名成立。“我总是犯那个错误。”杰克上尉回答道。马修·赫布斯特(Matthew Herbst)的也很好(关于计时器),但我不喜欢相信计时器的想法。运行API的服务器可能会重新启动。或者他们可以在某个时候更改过期时间。太多的未知。对无效令牌错误作出反应并获取新令牌似乎是一条可行之路。
    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
        })
    }