谷歌Javascript API(gapi)- .load出现问题

5

我正在尝试使用Google Plus API(通过googie-api-javascript)实现,方式如下(省略完整代码):

var clientId = '7454475891XxxxxxXom4c6n.apps.googleusercontent.com'; //fake client
var apiKey = '-uTH_p6NokbrXXXXXXXXXXXXX'; //Fake Key
var scopes = 'https://www.googleapis.com/auth/plus.me';

function handleClientLoad() {
   gapi.client.setApiKey(apiKey);
   window.setTimeout(checkAuth,1);
}

function checkAuth() {
   gapi.auth.authorize({client_id: clientId, scope: scopes, immediate: true}, handleAuthResult);
}


function handleAuthResult(authResult) {        
  if (authResult && !authResult.error) {          
    makeApiCall();
  } else {
    //handle user-approval
  }
}

  // Load the API and make an API call.  Display the results on the screen.
function makeApiCall() {
    gapi.client.load('plus', 'v1', function() {
      var o = gapi.client.plus;
      alert(o);
    });
}

代码在gapi.client.load(包括用户允许访问)的时候工作正常——这个回调被调用了,但是alert(o)会返回undefined。

检查HTTP请求后,我发现.load向以下地址发送请求:

https://content.googleapis.com/discovery/v1/apis/plus/v1/rpc?fields=methods%2F*%2Fid&pp=0&key=-uTH_p6NokbrXXXXXXXX

这将返回HTTP 400错误,并显示以下消息:
{"error":{"errors":[{"domain":"usageLimits","reason":"keyInvalid","message":"Bad Request"}],"code":400,"message":"Bad Request"}}

我的问题是 - 我需要改变什么才能让这个工作?我需要启用某些秘密设置吗?Google+在API列表下已在google-developer-console中被启用。
感谢您的帮助,Alon
3个回答

11

问题: .load命令向Google发现服务发送请求以加载.JS文件。如果请求中包含API密钥,该服务将出现错误。(我不知道为什么库会这样工作,似乎是一个bug?)

解决方法:

gapi.client.setApiKey(""); //NEW
gapi.client.load('plus', 'v1', function()
//re-add the key later if you need it

根据Discovery Service文档: 请求Discovery Service API时不应包含API密钥。如果您提供了密钥,则请求将失败。

有点奇怪... :P


1
哇..太感谢了,我怎么可能会找到那个!特别是在谷歌的文档和示例中,他们并没有提供一个。 - NaturalBornCamper

2
一则更新和更详细的说明。现有的Discovery Service页面现在更加具体。他们指出,如果应用程序有一个Oauth2令牌,则不需要API密钥值。然而,我还发现,如果我有一个已验证的用户,因此有一个Oauth2令牌(access_token),则发现服务会失败,并显示OP中提到的错误。这似乎与文档相矛盾。
您可以在开发者工具控制台中看到该令牌:
console.log(gapi.auth2.getAuthInstance().currentUser.get().getAuthResponse());

将其嵌入到HTML中的<script>...</script>标签或者其他被称为.js文件中。必须在gapi.load(...)之后执行,否则脚本会停止运行。
当然,要获取当前用户信息,这必须在用户已经通过身份验证之后才能进行。如果用户没有通过身份验证,则会返回一个对象。如果您使用的是Chrome浏览器,可以在开发人员工具控制台窗口中展开该对象,以获取身份验证响应中所有内容的漂亮轮廓格式。
请注意,在成功身份验证之前,currentUser是未定义的。由于它“静默失败”,您应该在真正的代码中使用条件语句来验证登录状态或当前用户是否存在。
对于完整性,我的应用程序中对象实例化过程大致如下:
1.)gapi.load(...) - 在此之后,gapi.client、gapi.auth2和其他对象可用。
2.)如果之前已经设置了API密钥以用于其他目的,则会调用gapi.client.setApiKey("")以“清除”API密钥。
3.) gapi.auth2.init(...) - 然后可以通过gapi.auth2.getAuthInstance获取认证实例。
4.) 然后使用认证实例的.signIn()方法启动登录。认证实例可以通过像auth_instance = gapi.auth2.getAuthInstance();这样的方式进行实例化。如果是这样做的话,那么登录将是auth_instance.signIn()。(...) - 意味着需要几个参数。
我还发现Google的tictactoe example很有用,作为一个示例和进一步工作的简单基础。
希望这对某人有所帮助!

0

你需要调用这个方法

function handleAuthClick(event) {
    gapi.auth.authorize({client_id: clientId, scope: scopes, immediate: false} handleAuthResult);
    return false;
}

function makeApiCall() {
     gapi.client.load('plus', 'v1', function () {
         var request = gapi.client.plus.people.get({
             'userId': 'me'
         });

         request.execute(function (resp) {
             'method ajax with you application'
         });
    });
}

你可以在这里看到它的作用here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接