設定逾時和重試

許多 Display & Video 360 API 方法會執行複雜作業,可能需要超過幾秒鐘才能完成。對這些方法提出的要求有時可能會超過預期的延遲時間,導致 API 或用戶端端發生錯誤。本頁面列出處理因延長的請求延遲所造成問題的做法。

增加用戶端程式庫中的預設逾時時間

在參考說明文件中,我們已將少數特定方法標示為經常超出預期的延遲時間。其他方法也可能會定期出現高延遲行為。

部分用戶端程式庫的預設逾時限制,可能會在提出高延遲要求時導致錯誤。部分支援的用戶端程式庫的預設逾時時間如下:

  • Java:20 秒
  • Python:60 秒
  • PHP:60 秒

只要提高這些預設逾時時間,就能避免用戶端逾時。請按照下列操作說明,在執行階段調整用戶端程式庫的預設逾時時間:

Java

  1. 匯入必要資源。

    import com.google.api.client.http.HttpRequest;
    import com.google.api.client.http.HttpRequestInitializer;
    import java.io.IOException;
    
  2. 建立用於設定 HTTP 逾時的函式。

    /**
     * Adjusts HTTP timeout values used by the provided request initializer.
     *
     * @param requestInitializer The {@link HttpRequestInitializer} used to authorize requests.
     * @param newHttpTimeout The HTTP timeout for requests in seconds.
     * @return An {@link HttpRequestInitializer} with modified HTTP timeout values.
     */
    private static HttpRequestInitializer setHttpTimeout(
        final HttpRequestInitializer requestInitializer,
        final int newHttpTimeout) {
      return new HttpRequestInitializer() {
        @Override
        public void initialize(HttpRequest httpRequest) throws IOException {
          requestInitializer.initialize(httpRequest);
          httpRequest.setConnectTimeout(newHttpTimeout * 1_000);
          httpRequest.setReadTimeout(newHttpTimeout * 1_000);
        }
      };
    }
    
  3. 建立 Display & Video 360 API 用戶端時呼叫函式。

    // Create authorized API client with non-default timeouts.
    DisplayVideo service =
        new DisplayVideo.Builder(
            credential.getTransport(),
            credential.getJsonFactory(),
            setHttpTimeout(credential, http-timeout-in-seconds)
        )
            .setApplicationName("displayvideo-java-installed-app-sample")
            .build();
    

Python

  1. 匯入 Google API Python 用戶端程式庫 http 模組。

    from googleapiclient import http
    
  2. 更新預設逾時常數。

    http.DEFAULT_HTTP_TIMEOUT_SEC = http-timeout-in-seconds
    
  3. 建構 API 服務。

    # Build the API service.
    service = discovery.build(
      'displayvideo',
      'v3',
      discoveryServiceUrl=discovery_url,
      credentials=credentials)
    

PHP

  1. 使用 Composer 下載並安裝 Guzzle HTTP 程式庫。

    composer require guzzlehttp/guzzle:^7.0
  2. 建立 Guzzle HTTP 用戶端,並指派逾時值。

    $httpClient = new \GuzzleHttp\Client(['timeout' => http-timeout-in-seconds]);
    
  3. 建立 Google 用戶端並指派 Guzzle HTTP 用戶端。

    $client = new Google_Client();
    $client->setHttpClient($httpClient);
    

處理 API 逾時錯誤

在極少數情況下,完成複雜作業的要求可能會超過伺服器端 180 秒的逾時時間,導致 API 傳回 408504 錯誤回應。

如果要求回應的錯誤代碼為上述任一項,建議您使用指數輪詢策略重試這些要求。

如果錯誤持續發生,請透過聯絡表單與支援團隊聯絡。