2012-08-09 74 views
2

使用此代碼將來自Drive UI的請求的初始代碼與可用於製作API請求的令牌交換。谷歌驅動器API交換授權碼有時會拋出500個

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%),我得到

An error occurred: com.google.api.client.auth.oauth2.TokenResponseException: 500 Error processing OAuth 2 request 
<HTML> 
<HEAD> 
<TITLE>Error processing OAuth 2 request</TITLE> 
</HEAD> 
<BODY BGCOLOR="#FFFFFF" TEXT="#000000"> 
<H1>Error processing OAuth 2 request</H1> 
<H2>Error 500</H2> 
</BODY> 
</HTML> 

可能是什麼問題呢?

+1

HTTP 500錯誤應該表示服務器端問題 - 不是授權或請求格式問題。 FWIW,我看到HTTP有時500個響應經由com.google.api.services.drive.Drive $文件$ List.execute 「www.googleapis.com/drive/v2/files」: \t'500內部服務器錯誤 \t { \t 「代碼」:500, \t 「錯誤」:[{ \t 「結構域」: 「全局」, \t 「消息」: 「內部錯誤」, \t 「原因」: 「InternalError該」 \t }], \t 「消息」: 「內部錯誤」 \t}' – 2012-08-09 15:56:11

+0

感謝確認我的恐懼,@BradTofel。問題在那裏,但我不能說服用戶,這不是我的代碼的錯......我應該引入重審機制?據我記得這樣的代碼只能交換一次,所以不知道這是否可行。 – x2305andy2305x 2012-08-10 06:36:38

+0

該代碼只能*成功*交換一次。既然你有'500',你應該安全的重試;如果確實代碼不能被重新交換,你會得到另一個狀態代碼,如'400'。在最壞的情況下,您必須重新將用戶重定向到授權頁面。 – Alain 2012-08-10 16:35:58

回答

0

我得到'500內部服務器錯誤'約。我的API調用的0.5%。我有一個重試機制,總是在第二次嘗試中成功。

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); 
    } 
+0

謝謝。這是我所嘗試的方式。然後發現這個幫助線程... [https://groups.google.com/forum/#!topic/oauth2-dev/J5_dlPPkHl0%5B1-25%5D](https://groups.google.com/論壇/#!topic/oauth2-dev/J5_dlPPkHl0%5B1-25%5D) 顯然可以肯定的是,如果發生這個錯誤,70秒後我肯定會得到一個很好的交換使用同樣的道理。同時用戶可以觀看電影或其他內容。 作爲一個假設,我實現了指數退避的重試,但有時甚至在5次重試(!!!)後我得到了同樣的錯誤。其他時間只需幾次重試。 – x2305andy2305x 2012-08-23 10:28:00

0

這是由於在授權過程(OAuth 2.0服務器端流程的授權碼交換)期間內部服務器中的2個超時導致的。我們正面臨與OAuth 2.0 Playground相同的問題。 Google現在應該已經解決了這個問題。 如果您再次遇到此問題,請告知我們。

重試機制通常適用於解決從Drive API獲得的瞬態503錯誤。但是在這種情況下(來自Auth服務器的500個錯誤)不起作用,因爲相同的呼叫在同一服務器配置(即遠程地理區域中的用戶和服務器)中每次都會超時。