javascript youtube api请求缓存

时间:2015-02-11 17:58:57

标签: youtube-api youtube-channels

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

我使用OAuth2和gapi.auth.authorize({client_id:' ...',范围:' ../ youtube',立即:false})来记录用户进入我的应用程序此方法允许用户选择要使用的连接帐户(身份)。

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

稍后在同一个应用中,用户可以点击按钮选择其他连接的帐户(身份)。我再次使用gapi.auth.authorize({client_id:' ...',范围:' ../ youtube',立即:false})方法。

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

一些评论: - 即11,它工作正常 - 在谷歌浏览器中,如果我从开发人员工具中禁用缓存,它也可以正常工作 - 在调用channels.list之前,我调用/ oauth2 / v2 / tokeninfo和/ plus / v1 / people / me,他们都返回正确的结果,即第二个帐户的数据

有没有办法纠正这个? 谢谢。

2 个答案:

答案 0 :(得分:0)

有人可以通过使用XMLHttpRequest来解决这个问题(参见https://developers.google.com/api-client-library/javascript/features/cors)。它可能是javascript YouTube api的错误。

答案 1 :(得分:0)

对我有用的是在请求中引入一个愚蠢的额外参数,以欺骗Google的系统...或者至少这是我的印象,因为它似乎始终如一:

我只是将其添加到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响应标头?

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

使用我的解决方案,我可以克服它。如果有人理解为什么可以详细说明此解决方案,那会很棒。