發出 HTTP(S) 要求

區域 ID

REGION_ID 是 Google 根據您在建立應用程式時選取的地區所指派的簡寫代碼。雖然某些區域 ID 可能看起來與常用的國家/地區代碼相似,但此代碼並非對應國家/地區或省份。如果是 2020 年 2 月後建立的應用程式,App Engine 網址會包含 REGION_ID.r。如果是在此日期之前建立的現有應用程式,網址中則可選擇加入地區 ID。

進一步瞭解區域 ID

本頁說明如何透過 App Engine 應用程式發出 HTTP(S) 要求。

App Engine 會使用網址擷取服務發出傳出 HTTP(S) 要求。 如要進一步瞭解要求大小上限和透過網址擷取要求傳送的標頭,請參閱「傳出要求」一文。

發出 HTTP 要求

PHP 語言提供多種用於發出遠端 HTTP 要求的函式。這些函式在 Google App Engine 中的部署方式並不相同,配額和費用也有差異:

  • 串流處理常式:原生的 http://https:// PHP 串流處理常式已設為使用 App Engine 的網址擷取服務發出 HTTP 要求。file_get_contents() 等許多 PHP 函式是以間接方式使用串流處理常式,因此也會使用網址擷取服務。
  • 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) 串流處理常式會用於 fopen()file_get_contents() 等內建 PHP 函式。

$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 選項來修改期限。

停用重新導向

如果您使用網址擷取服務,則基礎網址擷取服務會根據預設追蹤最多五次重新導向。這些重新導向可能會將機密資訊 (例如授權標頭) 轉寄至重新導向的目的地。如果應用程式不需要 HTTP 重新導向,建議您停用重新導向。

如要禁止網址擷取服務追蹤重新導向連結,您必須將應用程式 HTTP context options 中的 follow_location 參數設為 false

發出 HTTPS 要求

請參閱上方的發佈 HTTP 要求一節。

停用主機憑證驗證

根據預設,App Engine 實作的 HTTPS 包裝函式會嘗試驗證主機的憑證,並拒絕憑證不相符的要求。如要停用這項行為,請在 SSL/TLS 結構定義選項中,將 verify_peer 的值設為 false

發出要求至其他 App Engine 應用程式

發出要求至其他 App Engine 應用程式時,App Engine 應用程式必須在要求中加入 X-Appengine-Inbound-Appid 標頭以表明自己的身分。如果您指示網址擷取服務不要追蹤重新導向,App Engine 會自動在要求中加入這個標頭。

如要瞭解如何停用重新導向,請參閱「停用重新導向」。

後續步驟

如要瞭解網址擷取服務,例如透過網址擷取要求傳送的標頭,請參閱傳出要求一文。