このページでは、URL 取得サービスを使用して HTTP および HTTPS のリクエストを送信し、レスポンスを受信する方法について説明します。
App Engine ですべてのアウトバウンド リクエストにデフォルトで URL 取得を使用する Python 2 ランタイムとは異なり、Python 3 で URL 取得を使用するには、urlfetch
ライブラリを明示的に呼び出す必要があります。
リクエスト
URL 取得サービス、または言語に関する慣用的なライブラリを使用して、アウトバウンド リクエストを発行できます。 Python では、urlfetch
ライブラリを直接使用するか、urllib.request
または requests
ライブラリを使用して HTTP リクエストを送信できます。
リクエストのプロトコル
アプリケーションは、HTTP または HTTPS のいずれかで URL を取得できます。必要なプロトコルは、ターゲット URL のプロトコルから判断されます。
取得された URL は、以下の範囲内にある任意のポートを使用します。
80
-90
440
-450
1024
-65535
URL にポート番号が含まれていない場合、使用するポートはプロトコルで判断します。HTTP リクエストはポート 80
を使用し、HTTPS リクエストはポート 443
を使用します。
リクエストのメソッド
URL 取得サービスを使用してリクエストを発行する場合、次のいずれかの HTTP メソッドを使用できます。
GET
POST
PUT
HEAD
DELETE
PATCH
リクエストには、HTTP ヘッダーを追加できます。POST
、PUT
、PATCH
リクエストにはペイロードを追加できます。
リクエストのプロキシ
URL 取得サービスは、HTTP/1.1 互換のプロキシを使用して結果を取得することに注意してください。
アプリケーションがリクエストを無限に繰り返さないようにするため、リクエスト ハンドラは自分自身の URL を取得することはできません。他の方法でも無限に再帰する可能性はあります。ユーザーが指定した URL に対するリクエストをアプリケーションで取得する場合には注意してください。
リクエスト ヘッダー
アプリケーションで送信リクエストに HTTP ヘッダーを設定できます。
たとえば、HTTP POST
リクエストを送信するときに、Content-Type
ヘッダーを明示的に設定しないと、ヘッダーは x-www-form-urlencoded
に設定されます。これは、ウェブフォームで使用されるコンテンツ タイプです。
セキュリティ上の理由から、アプリケーションで次のヘッダーを変更することはできません。
Content-Length
Host
Vary
Via
X-Appengine-Inbound-Appid
X-Forwarded-For
X-ProxyUser-IP
これらのヘッダーには、必要に応じて App Engine が適切な値を設定します。たとえば、App Engine はリクエスト データから Content-Length
ヘッダーを計算し、その結果をリクエストに追加してから送信します。
次のヘッダーは、リクエスト側のアプリのアプリケーション ID を表します。
User-Agent
。このヘッダーは変更可能ですが、サーバーが App Engine のリクエストを識別できるように App Engine が ID 文字列を追加します。追加される文字列の形式は"AppEngine-Google; (+http://code.google.com/appengine; appid: APPID)"
で、APPID
はアプリの識別子です。X-Appengine-Inbound-Appid
。このヘッダーは変更できません。リクエストが URL 取得サービス経由で送信されたときに、follow redirects パラメータがFalse
に設定されると、自動的に追加されます。
リクエストのタイムアウト
リクエストの期限(タイムアウト)を設定できます。リクエストのデフォルトのタイムアウトは 10 秒に設定されています。
同期リクエストと非同期リクエストの両方を送信できます。次の動作が URL Fetch API に適用されます。
- 同期リクエスト: リモートホストが結果を戻すまで取得呼び出しが待機し、結果を返すと、制御をアプリケーションに戻します。取得呼び出しの最大待機時間を経過すると、例外が発生します。
- 非同期リクエスト: URL 取得サービスはリクエストを開始し、オブジェクトと一緒にすぐに値を返します。URL の取得が完了するまで、アプリケーションは他の作業を行うこともできます。アプリケーションで結果が必要な場合には、オブジェクトでメソッドを呼び出すと、オブジェクトがリクエストの完了を待機し、結果を返します。リクエスト ハンドラの終了時に、URL 取得リクエストが保留中の場合、アプリケーション サーバーは残りのすべてのリクエストを待機します。ユーザーにレスポンスを返す前にタイムアウトが発生する場合もあります。
安全な接続と HTTPS
アプリケーションで、HTTPS を使用して安全なサーバーに接続し、URL を取得することもできます。リクエストとレスポンスのデータは暗号化され、ネットワーク上で送受信されます。
Python API のデフォルトでは、URL 取得プロキシはホストとの接続を検証しません。ホストの検証を有効にするには、オプションの validate_certificate
引数を fetch()
メソッドに追加します。
レスポンス
URL Fetch API を使用する場合、URL 取得サービスは、レスポンス コード、ヘッダー、本文を含むすべてのレスポンス データを返すことに注意してください。
デフォルトでは、URL 取得サービスがリダイレクト コードを含むレスポンスを受信すると、サービスがリダイレクトします。サービスは、最大 5 つまでのリダイレクト レスポンスに対応し、最後のリソースを返します。 リダイレクトを実行しないように URL フェッチ サービスに指示することもできます。その場合、アプリケーションにリダイレクト レスポンスを返します。
開発用サーバーでの URL 取得の使用
パソコン上の App Engine 開発用サーバーでアプリケーションを実行している場合、URL 取得サービスに対する呼び出しはローカルで処理されます。開発用サーバーは、パソコンからリモートホストに直接接続して URL を取得します。この場合、パソコンのネットワーク接続を使用してインターネットにアクセスします。
URL を取得するアプリケーションの機能をテストする場合、パソコンからリモートホストにアクセスします。
URL 取得の割り当てと制限
URL 取得サービスの割り当てについては、割り当てをご覧ください。アプリケーションの現在の割り当て使用量を確認するには、Google Cloud コンソールの割り当ての詳細ページに移動します。
また、URL 取得サービスの使用には、以下の制限も適用されます。
Limit | Amount |
---|---|
Request size | 10 megabytes |
Request header size | 16 KB (Note that this limits the maximum length of the URL that can be specified in the header) |
Response size | 32 megabytes |
Maximum deadline (request handler) | 60 seconds |
Maximum deadline (Task Queue and cron job handler) | 60 seconds |