0

我希望能够在 JS 代码中调用 Google+,例如:

    gapi.client.plus.people.get({"userId": "me"});

在我的 HTML 中,我正在加载以下 JS 源代码:

    <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
    <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=[our maps api key]&sensor=true"></script>
    <script type="text/javascript" src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
    <script type="text/javascript" src="biketracker.js"></script>
    <script type="text/javascript" src="https://apis.google.com/js/client.js?onload=onGoogleJsClientLoaded"></script>

在 biketracker.js 中,我还对 Google+ JS 进行了异步加载:

(function() {
    var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
    po.src = 'https://apis.google.com/js/plusone.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
})();

加载 Google JS 客户端源时的回调会加载其他三个 Google API:

function onGoogleJsClientLoaded() {
    console.log("onGoogleJsClientLoaded()");

    gapi.client.load("biketracker", "v1", onBikeTrackerApiLoaded, endpointsRoot);
    gapi.client.load("oauth2", "v2", onOAuth2Loaded);
    gapi.client.load("plus", "v1", onGooglePlusClientLoaded);
}

其中第一个并不是真正的 Google API,而是我们开发的 Google Endpoints API,托管在 App Engine 上。忽略它。OAuth2 加载得很好。但是,Plus API 给了我这些错误:

Invalid gadgets.rpc token. 2006255737 vs 542328210
Uncaught Error: m`apiproxy6892d048ac55f727a04aed9791f4e586b15e69860.4984859501703547

我找不到其他人有同样的错误。我究竟做错了什么?

4

1 回答 1

3

您使用的是 Google+ 登录、+1 按钮还是各种徽章?如果您不使用这些功能(尽管如果您有社交应用程序可能应该使用这些功能),那么您不需要 plusone.js:Google 客户端库是您访问 API 所需要的,如果定义了 gapi.client,您应该是能够毫无问题地加载 Google+ 客户端库。要对此进行测试,您可以查看 gapi.client.plus... 是否存在,如果存在,您就可以访问 Google+ 端点!

如果您正在使用 Google+ 登录,则不应在您自己的 JS 模块中执行 Google API 脚本的异步加载。由于超出此答案范围的原因,JavaScript Google 客户端库使用的一些 JavaScript 代码必须全局初始化。这是您的错误的第二个最可能的原因。

这些错误可能不会导致您的网站出现错误。plusone.js 脚本用于在屏幕上呈现各种小部件,例如 Google+ 登录按钮,它最有可能是您遇到的 RPC 错误的罪魁祸首。有时,API 可能会在首次加载时失败,只要按钮按预期呈现就可以了。

您可能会遇到客户端库或 Google+ 库相互竞争的竞争条件。尝试在 plusone.js 之外包含 client.js 您的异步加载函数,并在脚本加载时添加回调:

<script type="text/javascript">
(function() {
  var po = document.createElement('script');
  po.type = 'text/javascript'; po.async = true;
  po.src = 'https://plus.google.com/js/client:plusone.js?onLoad=onGoogleJsClientLoaded';
  var s = document.getElementsByTagName('script')[0];
  s.parentNode.insertBefore(po, s);
})();

于 2013-07-12T00:32:30.987 回答