发出 HTTP(S) 请求

区域 ID

REGION_ID 是 Google 根据您在创建应用时选择的区域分配的缩写代码。此代码不对应于国家/地区或省,尽管某些区域 ID 可能类似于常用国家/地区代码和省代码。对于 2020 年 2 月以后创建的应用,REGION_ID.r 包含在 App Engine 网址中。对于在此日期之前创建的现有应用,网址中的区域 ID 是可选的。

详细了解区域 ID

本页介绍如何从 App Engine 应用发出 HTTP(S) 请求。

App Engine 使用网址提取服务来发出出站 HTTP(S) 请求。 如需详细了解请求大小限制以及 URL Fetch 请求中发送的标头,请参阅出站请求

发出 HTTP 请求

PHP 语言提供了多个发出远程 HTTP 请求的函数。 这些函数在 Google App Engine 中以不同方式实现,并受不同配额和费用的约束:

  • 流处理程序:将原生 http://https:// PHP 流处理程序配置为使用 App Engine 的网址提取服务发出 HTTP 请求。许多 PHP 函数(如 file_get_contents())间接使用流处理程序,因此也会使用网址提取服务。
  • cURL 扩展程序cURL 扩展程序使用套接字服务。应用的 php.ini 文件必须启用 cURL 扩展程序,并且必须为项目启用结算功能。
  • cURL“精简版”:cURL“精简版”是由 Google 提供的 cURL 库版本,该版本使用网址提取服务,而不是套接字服务。您必须在应用的 php.ini 文件中启用 cURL“精简版”。不支持 cURL 扩展程序的以下方法:
    • curl_multi_* 个函数
    • 对非标准协议的支持
    • 对除 80 (HTTP) 或 443 (HTTPS) 之外的端口的支持

确定是使用 cURL、cURL 精简版还是流封装容器在很大程度上取决于应用和偏好设置。如果您无法确定,请使用 Guzzle HTTP 库。Guzzle 会为 HTTP 请求提供抽象层,您可以通过它更改底层服务,而无需重写应用代码。

流处理程序

标准 HTTP(S) 流处理程序可在内置 PHP 函数,例如 fopen()file_get_contents()

$url = 'http://httpbin.org/post?query=update';
$data = ['data' => 'this', 'data2' => 'that'];
$headers = "accept: */*\r\n" .
    "Content-Type: application/x-www-form-urlencoded\r\n" .
    "Custom-Header: custom-value\r\n" .
    "Custom-Header-Two: custom-value-2\r\n";

$context = [
    'http' => [
        'method' => 'POST',
        'header' => $headers,
        'content' => http_build_query($data),
    ]
];
$context = stream_context_create($context);
$result = file_get_contents($url, false, $context);

cURL 和 cURL“精简版”

在 php.ini 中启用 cURL 或 cURL“精简版”可将 cURL 函数用于出站请求。cURL“精简版”使用网址提取服务,而 cURL 则使用 Sockets API

$url = 'http://httpbin.org/post?query=update';
$data = ['data' => 'this', 'data2' => 'that'];
$headers = [
    'Accept: */*',
    'Content-Type: application/x-www-form-urlencoded',
    'Custom-Header: custom-value',
    'Custom-Header-Two: custom-value-2'
];

// open connection
$ch = curl_init();

// set curl options
$options = [
    CURLOPT_URL => $url,
    CURLOPT_POST => count($data),
    CURLOPT_POSTFIELDS => http_build_query($data),
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_RETURNTRANSFER => true,
];
curl_setopt_array($ch, $options);

// execute
$result = curl_exec($ch);

// close connection
curl_close($ch);

Guzzle

默认情况下,Guzzle 使用 PHP 的流处理程序,但如果启用了 cURL 或 cURL“精简版”,它将自动使用 cURL 处理程序。

$url = 'http://httpbin.org/post?query=update';
$data = ['data' => 'this', 'data2' => 'that'];
$headers = [
    'Accept' => '*/*',
    'Content-Type' => 'application/x-www-form-urlencoded',
    'Custom-Header' => 'custom-value',
    'Custom-Header-Two' => 'custom-value',
];

$guzzle = new GuzzleHttp\Client;
$request = new GuzzleHttp\Psr7\Request('POST', $url, $headers, http_build_query($data));
$result = $guzzle->send($request);

设置请求超时

使用 HTTP 上下文中的 timeout 选项更改截止时间。

停用重定向

如果您使用 URL Fetch,则默认情况下,URL Fetch 服务最多遵循五个重定向。这些重定向可能会将敏感信息(如授权标头)转发到重定向的目的地。如果应用不需要 HTTP 重定向,则建议您停用重定向。

如需指示网址提取服务不遵循重定向,您的应用必须将 HTTP 上下文选项中的 follow_location 参数设置为false

发出 HTTPS 请求

请参阅上文的发出 HTTP 请求

停用主机证书验证

默认情况下,HTTPS 封装容器的 App Engine 实现会尝试验证主机证书,并拒绝证书不匹配的请求。如需停用此处理方式,请将 SSL/TLS 上下文选项中的 verify_peer 的值设置为 false

向其他 App Engine 应用发出请求

向其他 App Engine 应用发出请求时,您的 App Engine 应用必须通过将标头 X-Appengine-Inbound-Appid 添加到请求中来声明其身份。如果您指示 URL Fetch 服务不遵循重定向,则 App Engine 会自动将此标头添加到请求中。

如需有关如何停用重定向的指导,请参阅停用重定向

后续步骤

参阅出站请求了解 URL Fetch 服务,例如在 URL Fetch 请求中发送的标头。