HTTP(S) リクエストの発行

リージョン ID

REGION_ID は、アプリの作成時に選択したリージョンに基づいて Google が割り当てる省略形のコードです。一部のリージョン ID は、一般的に使用されている国や州のコードと類似しているように見える場合がありますが、このコードは国または州に対応するものではありません。2020 年 2 月以降に作成されたアプリの場合、REGION_ID.r は App Engine の URL に含まれています。この日付より前に作成されたアプリの場合、URL のリージョン ID は省略可能です。

詳しくは、リージョン ID をご覧ください。

このページでは、App Engine アプリから HTTP(S) リクエストを発行する方法について説明します。

App Engine は、URL 取得サービスを使用して、送信 HTTP(S) リクエストを発行します。 リクエスト サイズの上限と URL 取得リクエストで送信されるヘッダーの詳細については、送信リクエストをご覧ください。

HTTP リクエストの発行

PHP 言語には、リモートから HTTP リクエストを行う関数がいくつか用意されています。これらは Google App Engine でさまざまな方法で実装され、割り当てや料金も異なります。

  • ストリーム ハンドラ: http://https:// に対するネイティブの PHP ストリーム ハンドラは、App Engine の URL 取得サービスを使用して HTTP リクエストを送信するように構成されています。file_get_contents() などの PHP 関数の多くは、ストリーム ハンドラを間接的に使用して URL 取得サービスを利用します。
  • cURL 拡張機能: cURL 拡張機能ではソケット サービスを使用します。アプリケーションの php.ini ファイルで cURL 拡張機能を有効にし、プロジェクトで課金を有効にする必要があります。
  • cURL "lite": cURL "lite" は Google が提供する cURL ライブラリで、ソケット サービスではなく URL 取得サービスを使用します。アプリケーションの php.ini ファイルで cURL "lite" を有効にする必要があります。cURL 拡張機能の次のメソッドは使用できません。
    • curl_multi_* 関数
    • 非標準プロトコルのサポート
    • 80(HTTP)と 443(HTTPS)以外のポートのサポート

cURL、cURL Lite、ストリーム ラッパーのどれを使用するかは、アプリケーションと環境設定によって異なります。わからない場合は、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 "lite"

cURL 関数を送信リクエストに使用するには、php.ini で cURL または cURL "lite" を有効にします。cURL "lite" では URL 取得サービスが使用され、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 "lite" が有効になっている場合は 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 取得を使用している場合、基本の URL 取得サービスはデフォルトで最大 5 回のリダイレクトを行います。これらのリダイレクトでは、認証ヘッダーなどの機密情報がリダイレクト先に転送される可能性があります。アプリで HTTP リダイレクトが不要な場合は、リダイレクトを無効にすることをおすすめします。

URL 取得サービスがリダイレクトされないようにするには、HTTP コンテキスト オプションfollow_location パラメータを false に設定する必要があります。

HTTPS リクエストの発行

前述の HTTP リクエストの発行をご覧ください。

ホスト証明書の検証を無効にする

デフォルトでは、App Engine に実装された HTTPS ラッパーがホストの証明書を検証し、証明書が一致しない場合はリクエストを拒否します。この動作を無効にするには、SSL / TLS コンテキスト オプションverify_peer の値を false に設定します。

別の App Engine アプリへのリクエストの発行

別の App Engine アプリにリクエストを発行する場合、App Engine アプリでリクエストにヘッダー X-Appengine-Inbound-Appid を追加して、その ID を表明する必要があります。URL 取得サービスにリダイレクトを実行しないよう指示する場合、App Engine はこのヘッダーをリクエストに自動的に追加します。

リダイレクトの無効化に関するガイダンスについては、リダイレクトの無効化を参照してください。

次のステップ

送信リクエスト内の URL 取得リクエストで送信されるヘッダーなど、URL 取得サービスについて学習する。