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

リージョン ID

REGION_ID は、アプリを作成するときに選択するリージョンに基づいて Google が割り当てるコードです。既存のアプリでは省略可能でしたが、新しいアプリでは App Engine の URL に REGION_ID.r を含めることが必須になります。

移行がスムーズに行われるように、リージョン ID を使用するよう App Engine を徐々に更新しています。Google Cloud プロジェクトがまだ更新されていない場合、アプリにリージョン ID が表示されません。ID は既存のアプリでは省略可能なため、リージョン ID が既存のアプリで使用可能になったときに、URL を更新する、またはその他の変更を行う必要はありません。

詳しくは、リージョン 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 回のリダイレクトに追随します。この動作を無効にするには、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 取得サービスについて学習する。