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

リージョン ID

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

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

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

デフォルトでは、Java 8 ランタイムで実行されるアプリケーションは、java.net.HttpURLConnection などの HTTP(S) リクエストに標準の Java クラスを使用します。他の Java アプリケーションの場合と同じように、リクエストを送信します。デフォルトの動作を使用するには、アプリケーションの課金を有効にする必要があります。有効にしない場合、次の例外が発生します。

  • java.net.UnknownHostException
  • java.net.SocketTimeoutException
  • java.io.IOException

標準ランタイム ネットワーク クラスの使用

標準の Java ネットワーク クラスを使用する場合、アプリは次の機能にアクセスできます。

URL 取得の使用

Java 8 アプリで URL 取得を使用する場合は、appengine-web.xml に次の行を追加します。

 <url-stream-handler>urlfetch</url-stream-handler>

例:

<xml version="1.0" encoding="utf-8">
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
  <!-- ... -->
  <url-stream-handler>urlfetch</url-stream-handler>
  <!-- ... -->
</appengine-web-app>

HTTP リクエストの発行

送信 HTTP リクエストを発行するには、java.net.URLConnection を使用します。

以下のスニペットでは、基本的な HTTP GET リクエストを実行します。アプリケーションは新しい URL オブジェクトを作成し、次にオブジェクトの openStream() メソッドを呼び出して、その URL のコンテンツを取得します。

URL url = new URL("http://api.icndb.com/jokes/random");
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
StringBuffer json = new StringBuffer();
String line;

while ((line = reader.readLine()) != null) {
  json.append(line);
}
reader.close();

高度なリクエストの場合は、次のような java.net.HttpURLConnection を使用します。

  1. 新しい URL オブジェクトを作成します。
  2. URL オブジェクトの openConnection() メソッドを呼び出して。新しい URLConnection オブジェクトを作成します。
  3. HttpURLConnection オブジェクト型に URLConnection オブジェクトをキャストして新しい HttpURLConnection オブジェクトを作成します。
  4. HttpURLConnection オブジェクトのリクエスト メソッドを設定します。
  5. リクエストの出力ストリームを作成します。
  6. リクエストのペイロードをストリームに書き込みます。
  7. ストリームを閉じます。

次のスニペットは、PUT リクエストを経由してウェブフォームからデータを送信し、HttpURLConnection により高度なリクエストを行う方法を示しています。

URL url = new URL("http://jsonplaceholder.typicode.com/posts/" + id);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// Enable output for the connection.
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
conn.setRequestProperty("Accept", "application/json");
// Set HTTP request method.
conn.setRequestMethod("PUT");

// Create JSON request.
JSONObject jsonObj =
    new JSONObject().put("userId", 1).put("id", id).put("title", text).put("body", text);

OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
writer.write(jsonObj.toString());
writer.close();

int respCode = conn.getResponseCode(); // New items get NOT_FOUND on PUT
if (respCode == HttpURLConnection.HTTP_OK || respCode == HttpURLConnection.HTTP_NOT_FOUND) {
  req.setAttribute("error", "");
  StringBuilder response = new StringBuilder();
  String line;

  // Read input data stream.
  BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
  while ((line = reader.readLine()) != null) {
    response.append(line);
  }
  reader.close();
  req.setAttribute("response", response.toString());
} else {
  req.setAttribute("error", conn.getResponseCode() + " " + conn.getResponseMessage());
}

リクエストのタイムアウトの設定

URL 取得を使用する場合、appengine-web.xml ファイル内の appengine.api.urlfetch.defaultDeadline 設定を使用してリクエストのデフォルト期限を調整できます。

ヘッダーの設定

URL 取得を使用している場合は、HttpURLConnection オブジェクトの setRequestProperty() メソッドを呼び出して、送信リクエストに HTTP ヘッダーを設定できます。次のスニペットでは、X-MyApp-Version ヘッダーを 2.7.3 に設定しています。

conn.setRequestProperty("X-MyApp-Version", "2.7.3");

リダイレクトの無効化

デフォルトでは、HttpURLConnection は HTTP リダイレクトに従います。

URL 取得を使用している場合、基本の URL 取得サービスはデフォルトで最大 5 回のリダイレクトを行います。これらのリダイレクトでは、認証ヘッダーなどの機密情報がリダイレクト先に転送される可能性があります。アプリで HTTP リダイレクトが不要な場合は、リダイレクトを無効にすることをおすすめします。

この動作を無効にするには、HttpURLConnection オブジェクトの setInstanceFollowRedirects() メソッドに値 false を渡します。

conn.setInstanceFollowRedirects(false);

アプリで java.net ではなく基礎となる urlfetch パッケージを直接使用する場合は、アプリで doNotFollowRedirects を指定する必要があります。

HTTPS リクエストの発行

URL 取得を使用している場合は、urlfetch パッケージの FetchOptions クラスを使用して HTTPS リクエストを発行し、validateCertificate() を呼び出します。

非同期リクエストの発行

HTTP(S) リクエストはデフォルトで同期されます。非同期リクエストを発行するには、アプリケーションで URLFetchServicefetchAsync() メソッドを使用する必要があります。このメソッドは java.util.concurrent.Future<HTTPResponse> を返します。

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

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

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

次のステップ

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