HTTP(S)-Anfragen senden

Regions-ID

REGION_ID ist ein abgekürzter Code, den Google anhand der Region zuweist, die Sie beim Erstellen Ihrer Anwendung ausgewählt haben. Der Code bezieht sich nicht auf ein Land oder eine Provinz, auch wenn einige Regions-IDs häufig verwendeten Länder- und Provinzcodes ähneln können. Bei Anwendungen, die nach Februar 2020 erstellt wurden, ist REGION_ID.r in den App Engine-URLs enthalten. Bei Anwendungen, die vor diesem Datum erstellt wurden, ist die Regions-ID in der URL optional.

Hier finden Sie weitere Informationen zu Regions-IDs.

Auf dieser Seite wird beschrieben, wie Sie in Ihrer App Engine-Anwendung HTTP(S)-Anfragen senden.

In der Java 8-Laufzeit ausgeführte Anwendungen verwenden standardmäßig Java-Standardklassen für HTTP(S)-Anfragen, z. B. java.net.HttpURLConnection. Sie senden Anfragen wie bei jeder anderen Java-Anwendung. Um das Standardverhalten zu verwenden, müssen Sie die Abrechnung für Ihre Anwendung aktivieren. Andernfalls erhalten Sie die folgenden Ausnahmen:

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

Standardlaufzeit-Netzwerkklassen verwenden

Wenn Sie die Standard-Netzwerkklassen für Java verwenden, hat Ihre Anwendung Zugriff auf die folgenden Features:

  • Die Beschränkung auf 32 MB für Anfragedaten wird entfernt.
  • HTTP 2.0 wird unterstützt.
  • Alle Google Cloud-basierten APIs, die über die Google Cloud-Clientbibliothek für Java zugänglich sind, werden unterstützt.

URL Fetch verwenden

Wenn Sie URL Fetch in einer Java 8-Anwendung verwenden müssen, fügen Sie der Datei appengine-web.xml die folgende Zeile hinzu:

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

Beispiel:

<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-Request senden

Verwenden Sie die Methode java.net.URLConnection, um ausgehende HTTP-Anfragen zu senden.

Das folgende Snippet veranschaulicht, wie eine grundlegende HTTP-GET-Anfrage ausgeführt wird: Die Anwendung erstellt ein neues URL-Objekt und ruft dann die openStream()-Methode des Objekts auf, um den Inhalt unter dieser URL abzurufen:

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();

Für komplexere Anfragen verwenden Sie java.net.HttpURLConnection so:

  1. Erstellen Sie ein neues URL-Objekt.
  2. Erstellen Sie ein neues URLConnection-Objekt, indem Sie die Methode openConnection() des URL-Objekts aufrufen.
  3. Erstellen Sie ein neues HttpURLConnection-Objekt, indem Sie das URLConnection-Objekt in den Objekttyp HttpURLConnection umwandeln.
  4. Legen Sie die Anfragemethode des HttpURLConnection-Objekts fest.
  5. Erstellen Sie einen Ausgabestream für den Request.
  6. Schreiben Sie die Request-Nutzlast in den Stream.
  7. Schließen Sie den Stream.

Das folgende Snippet zeigt, wie Sie mit HttpURLConnection eine komplexere Anfrage ausführen und Daten aus einem Webformular über eine PUT-Anfrage senden:

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());
}

Anfragezeitüberschreitung festlegen

Wenn Sie URL Fetch verwenden, können Sie die Standardfrist für Anfragen mit der Einstellung appengine.api.urlfetch.defaultDeadline in der Datei appengine-web.xml anpassen.

Headers festlegen

Wenn Sie den URL-Abruf verwenden, können Sie einen HTTP-Header für die ausgehende Anfrage festlegen, indem Sie die Methode setRequestProperty() Ihres HttpURLConnection-Objekts aufrufen. Mit dem folgenden Snippet wird der Header von X-MyApp-Version auf 2.7.3 gesetzt:

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

Weiterleitungen deaktivieren

HttpURLConnection folgt standardmäßig HTTP-Weiterleitungen.

Wenn Sie URL Fetch verwenden, folgt der zugrunde liegende URL-Abrufdienst standardmäßig bis zu fünf Weiterleitungen. Diese Weiterleitungen können vertrauliche Informationen wie Autorisierungsheader an das Weiterleitungsziel weiterleiten. Wenn Ihre Anwendung keine HTTP-Weiterleitungen erfordert, empfehlen wir, die Weiterleitungen zu deaktivieren.

Um dieses Verhalten zu deaktivieren, übergeben Sie den Wert false an die Methode setInstanceFollowRedirects() des HttpURLConnection-Objekts:

conn.setInstanceFollowRedirects(false);

Wenn die Anwendung anstatt java.net direkt das zugrunde liegende Paket urlfetch verwendet, muss in der Anwendung doNotFollowRedirects angegeben sein.

HTTPS-Request senden

Wenn Sie URL Fetch verwenden, senden Sie eine HTTPS-Anfrage mit der Klasse FetchOptions im Paket urlfetch und rufen Sie validateCertificate() auf.

Asynchrone Requests senden

HTTP(S)-Requests sind standardmäßig synchron. Um eine asynchrone Anfrage zu senden, muss Ihre Anwendung die Methode fetchAsync() von URLFetchService verwenden. Diese Methode gibt eine java.util.concurrent.Future<HTTPResponse> zurück.

Requests an andere App Engine-Anwendungen senden

Wenn Sie eine Anfrage an eine andere App Engine-Anwendung senden, muss die Identität dieser Anwendung bestätigt werden. Geben Sie zusätzlich in die Anfrage den Header X-Appengine-Inbound-Appid ein. Wenn Sie den URL-Abrufdienst so konfigurieren, dass er keiner Weiterleitung folgt, fügt App Engine diesen Header automatisch zu Anfragen hinzu.

Informationen zum Deaktivieren von Weiterleitungen finden Sie unter Weiterleitungen deaktivieren.

Nächste Schritte

Unter Ausgehende Anfragen finden Sie weitere Informationen zum URL-Abrufdienst, z. B. zu den Headern, die in einer URL-Abrufanfrage gesendet werden.