某些 API 方法会执行复杂的任务,可能需要花费几秒钟以上的时间才能完成。这些请求可能需要比默认允许的时间更长的时间。这可能会导致 API 或客户端出现错误。这些方法有助于避免因请求延迟时间过长而导致的问题。
增加客户端库中的默认超时时间
有些方法通常会以高延迟响应。方法参考页面上对此进行了说明。其他方法也可能会在极少数情况下出现高延迟响应。
某些客户端库具有默认的超时限制。当请求延迟时间较长时,这些限制会导致错误。部分受支持的客户端库的默认超时时间如下:
- Java:20 秒。
- Python:60 秒。
- PHP:60 秒。
提高这些默认限制,以避免出现客户端错误。以下是如何更改客户端库的默认超时时间:
Java
导入必要的资源。
import com.google.api.client.http.HttpRequest; import com.google.api.client.http.HttpRequestInitializer; import java.io.IOException;用于设置 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); } }; }创建 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
导入 Google API Python 客户端库 HTTP 模块。
from googleapiclient import http更新默认超时常量。
http.DEFAULT_HTTP_TIMEOUT_SEC = http-timeout-in-seconds构建 API 服务。
# Build the API service. service = discovery.build( 'displayvideo', 'v3', discoveryServiceUrl=discovery_url, credentials=credentials)
PHP
使用 Composer 下载并安装 Guzzle HTTP 库。
composer require guzzlehttp/guzzle:^7.0创建 Guzzle HTTP 客户端,并分配超时值。
$httpClient = new \GuzzleHttp\Client(['timeout' => http-timeout-in-seconds]);创建 Google 客户端并分配 Guzzle HTTP 客户端。
$client = new Google_Client(); $client->setHttpClient($httpClient);
处理 API 超时错误
在极少数情况下,请求可能会超过 180 秒的服务器超时时间。在这种情况下,API 会返回 408 或 504 错误。
如果请求返回上述任一代码,请使用指数退避算法重试请求。
如果此错误仍然存在,请与 API 支持团队联系。