このページでは、App Engine アプリケーションが HTTP / HTTPS リクエストを送信し、レスポンスを受信する方法を説明します。App Engine アプリケーションから HTTP / HTTPS リクエストを送信するコードのサンプルについては、HTTP(S) リクエストの送信をご覧ください。
リクエスト
App Engine Java 8 ランタイムでは、java.net.URLConnection
抽象クラスと Java 標準ライブラリの関連クラスを使用して、Java アプリケーションから HTTP 接続と HTTPS 接続を確立できます。
または、App Engine URL 取得 API を使用して、URLConnection
で定義されたメソッドを URL 取得 API で実装することもできます。ネイティブ Java クラスと URL 取得 API の使用の詳細については、Java 8 で URL 取得ではなく標準 Java 呼び出しを使用することの利点をご覧ください。
リクエストのプロトコル
アプリケーションは、HTTP または HTTPS のいずれかで URL を取得できます。必要なプロトコルは、ターゲット URL のプロトコルから判断されます。
取得された URL は、以下の範囲内にある任意のポートを使用します。
80
~90
440
~450
1024
~65535
URL にポート番号が含まれていない場合、使用するポートはプロトコルで判断します。HTTP リクエストはポート 80
を使用し、HTTPS リクエストはポート 443
を使用します。
リクエストのメソッド
標準 Javajava.net.URLConnection
クラスからリクエストを発行した場合、サポートされているすべての HTTP メソッドを使用できます。
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 取得サービス経由で送信されたときに、リダイレクト パラメータがFalse
に設定されると、自動的に追加されます。
リクエストのタイムアウト
リクエストの期限(タイムアウト)を設定できます。リクエストのデフォルトのタイムアウトは 10 秒に設定されています。期限の最大値は、HTTP(S) リクエストの場合は 60 秒であり、Task Queue および cron ジョブ リクエストの場合も 60 秒です。URL 取得で URLConnection
抽象クラスを使用する場合、サービスは接続タイムアウト(setConnectTimeout()
)とリード タイムアウト(setReadTimeout()
)を期限として設定します。
同期リクエストと非同期リクエストの両方を送信できます。次の動作が URL Fetch API に適用されます。
- 同期リクエスト: リモートホストが結果を戻すまで取得呼び出しが待機し、結果を返すと、制御をアプリケーションに戻します。取得呼び出しの最大待機時間を経過すると、例外が発生します。
- 非同期リクエスト: URL 取得サービスはリクエストを開始し、オブジェクトと一緒にすぐに値を返します。URL の取得が完了するまで、アプリケーションは他の作業を行うこともできます。アプリケーションで結果が必要な場合には、オブジェクトでメソッドを呼び出すと、オブジェクトがリクエストの完了を待機し、結果を返します。リクエスト ハンドラの終了時に、URL 取得リクエストが保留中の場合、アプリケーション サーバーは残りのすべてのリクエストを待機します。ユーザーにレスポンスを返す前にタイムアウトが発生する場合もあります。
安全な接続と HTTPS
アプリケーションで、HTTPS を使用して安全なサーバーに接続し、URL を取得することもできます。リクエストとレスポンスのデータは暗号化され、ネットワーク上で送受信されます。
URL 取得 API を使用する場合、URL 取得プロキシでは接続中のホストが検証されないため、注意が必要です。HTTPS を使用したときに、プロキシ サーバーが App Engine とリモートホストの間の中間者攻撃を検出できなくなります。ホスト検証を有効にするには、URLFetchService
API の FetchOptions
クラスを使用します。
レスポンス
URL Fetch API を使用する場合、URL 取得サービスは、レスポンス コード、ヘッダー、本文を含むすべてのレスポンス データを返すことに注意してください。
デフォルトでは、URL 取得サービスがリダイレクト コードを含むレスポンスを受信すると、サービスがリダイレクトします。サービスは、最大 5 つまでのリダイレクト レスポンスに対応し、最後のリソースを返します。リダイレクトを実行しないように URL 取得サービスに指示することもできます。その場合、アプリケーションにリダイレクト レスポンスを返します。
開発用サーバーでの URL 取得の使用
パソコン上の App Engine 開発用サーバーでアプリケーションを実行している場合、URL 取得サービスに対する呼び出しはローカルで処理されます。開発用サーバーは、パソコンからリモートホストに直接接続して URL を取得します。この場合、パソコンのネットワーク接続を使用してインターネットにアクセスします。
URL を取得するアプリケーションの機能をテストする場合、パソコンからリモートホストにアクセスします。
URL 取得の割り当てと制限
Java ランタイムの場合、URL 取得の代わりに標準 Javajava.net.URLConnection
API を使用します。ただし、以下の割り当てと上限の考慮事項は適用されません。URL 取得サービスの割り当てについては、割り当てをご覧ください。アプリケーションの現在の割り当て使用量を確認するには、Google Cloud Console の割り当ての詳細ページに移動します。
また、URL 取得サービスの使用には、以下の制限も適用されます。
制限 | 値 |
---|---|
リクエスト サイズ | 10 MB |
リクエスト ヘッダーのサイズ | 16 KB(ヘッダーで指定可能な URL の最大長) |
レスポンス サイズ | 32 MB |
期限の最大値(リクエスト ハンドラ) | 60 秒 |
期限の最大値(タスクキューおよび cron ジョブハンドラ) | 60 秒 |
次のステップ
HTTP(S) リクエストの発行の説明に沿ってコードサンプルを実行し、アプリケーションからリクエストを発行する。