Google drive api google Drive API交换授权代码每次抛出500次

Google drive api google Drive API交换授权代码每次抛出500次,google-drive-api,Google Drive Api,使用此代码将来自驱动器UI的请求的初始代码与可用于发出API请求的令牌交换 public GoogleCredential exchangeCode(String authorizationCode) throws CodeExchangeException { try { GoogleTokenResponse response = new GoogleAuthorizationCodeTokenRequest(new NetHttpTransport(

使用此代码将来自驱动器UI的请求的初始代码与可用于发出API请求的令牌交换

public GoogleCredential exchangeCode(String authorizationCode) throws CodeExchangeException {
        try {
            GoogleTokenResponse response = new GoogleAuthorizationCodeTokenRequest(new NetHttpTransport(), new JacksonFactory(), CLIENT_ID, CLIENT_SECRET, authorizationCode, REDIRECT_URI).execute();
            return new GoogleCredential.Builder().setClientSecrets(CLIENT_ID, CLIENT_SECRET).setTransport(new NetHttpTransport()).setJsonFactory(new JacksonFactory()).build().setFromTokenResponse(response);
        }
        catch (Exception e) {
            log.error("An error occurred: " + e);
            throw new CodeExchangeException(null);
        }
    }
在大多数情况下,它是有效的,但在某些情况下(可能是5%),我得到

发生错误:com.google.api.client.auth.oauth2.TokenResponseException:处理OAuth 2请求时发生500错误
处理OAuth 2请求时出错
处理OAuth 2请求时出错
误差500

可能是什么问题?

我的API调用中约有0.5%出现“500个内部服务器错误”。我有一个重试机制,它似乎总是在第二次尝试时成功

    function doSomething(req) {
.
.
.
.
         restRequest.execute(function(resp) {
    var myResp = new Object();

    try {
        if (resp.error) {
            if (resp.error.code == "401") {
                do401(function() {
                    doSomething(req);
                }, req, myResp);
                return;
            }
            if (resp.error.code == "403") {
                cl("403 no auth " + resp.error.message);
                return;
            }
            if (resp.error.code == "500") {
                cl("server error 500, retrying " + resp.error.message);
                exponentialBackoff();
                                    doSomething(req);
                return;
            }
        }
    } catch (ex) {
        cl("[fg62] exception " + ex);
    }

我的API调用中约有0.5%出现“500个内部服务器错误”。我有一个重试机制,它似乎总是在第二次尝试时成功

    function doSomething(req) {
.
.
.
.
         restRequest.execute(function(resp) {
    var myResp = new Object();

    try {
        if (resp.error) {
            if (resp.error.code == "401") {
                do401(function() {
                    doSomething(req);
                }, req, myResp);
                return;
            }
            if (resp.error.code == "403") {
                cl("403 no auth " + resp.error.message);
                return;
            }
            if (resp.error.code == "500") {
                cl("server error 500, retrying " + resp.error.message);
                exponentialBackoff();
                                    doSomething(req);
                return;
            }
        }
    } catch (ex) {
        cl("[fg62] exception " + ex);
    }

这是由授权过程中两个内部服务器之间的超时(OAuth 2.0服务器端流的身份验证代码交换)引起的。我们在OAuth2.0操场上也面临同样的问题。这应该已经由谷歌的auth团队解决了。 如果您再次遇到此问题,请告知我们


重试机制通常可以很好地解决从驱动器API获得的瞬时503错误。但在这种情况下(来自身份验证服务器的500个错误),它没有帮助,因为对于相同服务器配置中的相同用户(即远程地理区域中的用户和服务器),相同的调用每次都会超时。

这是由授权过程中两个内部服务器之间的超时造成的(OAuth 2.0服务器端流的身份验证代码交换)。我们在OAuth 2.0平台上也遇到了同样的问题。这应该已经由Google的身份验证团队解决了。 如果您再次遇到此问题,请告知我们


重试机制通常可以很好地解决从驱动器API获得的暂时性503错误。但在这种情况下(来自身份验证服务器的500个错误),它没有帮助,因为对于相同服务器配置中的相同用户(即远程地理区域中的用户和服务器),相同的调用每次都会超时HTTP 500错误被认为是服务器端问题,而不是授权或请求格式问题。FWIW,我有时会通过com.google.api.services.drive.drive$files$List.execute:
500内部服务器错误{“code”:500,“错误”:[{“域”:“全局”,“消息”:“内部错误”,“原因”:“内部错误”}],“消息”:“内部错误”}
谢谢你证实我的担心,@BradTofel。尽管如此,问题还是存在的,我无法说服用户这不是我的代码的错……我应该引入一个重试机制吗?据我记忆所及,这样的代码只能交换一次,所以不确定是否有效。代码只能成功交换一次。因为你有
500
,您应该可以安全地重试;如果确实无法重新交换代码,您将获得另一个状态代码,如
400
。最坏的情况是,您必须再次将用户重定向到授权页面。Alain,关于是否进行此“500重试”的评论“至少在某些情况下,默认API的一部分似乎是提高感知服务稳定性、避免麻烦和重复代码、帮助实施建议的重试策略(如指数退避等)的简单方法。”HTTP 500错误应该表示服务器端问题,而不是授权或请求格式问题。FWIW,我有时会通过com.google.api.services.drive.drive$files$List看到“www.googleapis.com/drive/v2/files”的HTTP 500响应。执行:
500内部服务器错误{“code”:500,“错误”:[{“域”:“全局”,“消息”:“内部错误”,“原因”:“内部错误”}],“消息”:“内部错误”}
谢谢你证实我的担心,@BradTofel。尽管如此,问题还是存在的,我无法说服用户这不是我的代码的错……我应该引入一个重试机制吗?据我记忆所及,这样的代码只能交换一次,所以不确定是否有效。代码只能成功交换一次。因为你有
500
,您应该可以安全地重试;如果确实无法重新交换代码,您将获得另一个状态代码,如
400
。最坏的情况是,您必须再次将用户重定向到授权页面。Alain,是否要执行此“在500上重试”操作至少在某些情况下,默认API的一部分似乎是提高感知服务稳定性、避免麻烦和重复代码、帮助实施推荐的重试策略(如指数退避等)的简单方法谢谢。这也是我尝试过的。然后找到了这个帮助线程…显然,如果出现这个错误,70秒后我肯定会使用相同的令牌进行良好的交换。同时,用户可以观看电影或其他东西。作为一种妄想,我用指数退避实现了重试,但是t有时甚至在5次重试之后(!!!)我也遇到了同样的错误。其他时候只需几次重试就可以了。谢谢。这也是我尝试过的。然后找到了这个帮助线程…显然,如果发生了这个错误,70秒后我肯定会使用相同的令牌进行很好的交换。与此同时,用户可以观看电影或其他东西。作为一个用户,我可以我用指数退避实现了重试,但有时即使重试5次(!!!)我也会得到相同的错误。其他时候,重试次数很少。