javascript youtubeapi请求缓存



我遇到了一个奇怪的问题。

我使用OAuth2和gap.auth.authenticate({client_id:"…",scope:"../youtube",immediate:false})将用户登录到我的应用程序中。此方法允许用户选择要使用的连接帐户(身份)。

我使用gap.client.youtube.channels.list和gap.client.youtube.playlistItems.list.检索用户的视频

稍后在同一应用程序中,用户可以单击一个按钮来选择另一个连接的帐户(身份)。我再次使用了gap.auth.authenticate({client_id:"…",scope:"../youtube",immediate:false})方法。

问题是,在成功更改帐户后,gap.client.youtube.channels.list方法会返回第一次调用的缓存结果。

一些备注:-在ie11中运行良好-在googlechrome中,如果我从开发人员工具中禁用缓存,它也可以正常工作-在调用channels.list之前,我调用/oauth2/v2/tokeninfo和/plus/v1/people/me,它们都返回正确的结果,即第二个帐户的数据

有什么方法可以纠正这个问题吗?非常感谢。

对我有用的是在欺骗谷歌系统的请求中引入了一个愚蠢的额外参数。。。或者至少这是我的印象,因为它似乎一直有效:

我只是把它添加到URL:

"https://www.googleapis.com/youtube/v3/channels?mine=true" +
  "&part=" + encodeURIComponent("id,snippet") +
  "&key=" + encodeURIComponent(API_KEY) +
  "&random=" + encodeURIComponent(Math.random().toString())

以下是完整的示例:

  refreshChannels(): Promise<YoutubeChannel[]> {
    return new Promise((resolve, reject) => {
      const xhr = new XMLHttpRequest();
      xhr.onreadystatechange = () => {
        if (xhr.readyState === 4) {
          if (xhr.status === 200) {
            this.channels = JSON.parse(xhr.response).items.map(ch => new YoutubeChannel().deserialize(ch));
            console.log("[Youtube][loadChannels] Got some channels:");
            console.log(this.channels);
            this.onReceivedYoutubeChannels.next(this.channels);
            resolve(this.channels);
          } else {
            reject(JSON.parse(xhr.response));
          }
        }
      };
      xhr.onerror = () => reject();
      const user = gapi.auth2.getAuthInstance().currentUser.get();
      const oAuthToken = user.getAuthResponse().access_token;
      xhr.open(
        "GET",
        "https://www.googleapis.com/youtube/v3/channels?mine=true&part=" +
          encodeURIComponent("id,snippet") +
          "&key=" +
          encodeURIComponent(API_KEY) +
          "&random=" + encodeURIComponent(Math.random().toString())
      );
      xhr.setRequestHeader("Authorization", "Bearer " + oAuthToken);
      xhr.send();
    });
  }

我有不同的ETag。我还看到了一个缓存控制响应标头,它可能也在缓存?

cache-control: private, max-age=300, must-revalidate, no-transform

有了我的解决方案,我可以克服它。如果有人理解为什么,如果能详细阐述这个解决方案,那就太好了。

有些人可以通过使用XMLHttpRequest来克服这个问题(请参阅https://developers.google.com/api-client-library/javascript/features/cors)。这可能是javascript YouTube api的一个错误。

相关内容

  • 没有找到相关文章

最新更新