Émettre des requêtes HTTP(S)

ID de la région

Le REGION_ID est un code abrégé que Google attribue en fonction de la région que vous sélectionnez lors de la création de votre application. Le code ne correspond pas à un pays ou une province, même si certains ID de région peuvent ressembler aux codes de pays et de province couramment utilisés. Pour les applications créées après février 2020, REGION_ID.r est inclus dans les URL App Engine. Pour les applications existantes créées avant cette date, l'ID de région est facultatif dans l'URL.

En savoir plus sur les ID de région

Cette page explique comment envoyer des requêtes HTTP(S) à partir de l'application App Engine.

Par défaut, les applications exécutées dans l'environnement d'exécution Java 8 utilisent des classes Java standards, telles que java.net.HttpURLConnection, pour les requêtes HTTP(S). Vous pouvez donc envoyer des requêtes comme vous le feriez pour toute autre application Java. Pour utiliser le comportement par défaut, vous devez activer la facturation pour votre application, sous peine d'être confronté aux exceptions suivantes :

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

Utiliser des classes réseau standards de l'environnement d'exécution

Si vous utilisez les classes réseau Java standards, votre application aura accès aux fonctionnalités suivantes :

Utiliser le service URL Fetch

Si vous devez utiliser la récupération d'URL dans une application Java 8, ajoutez la ligne suivante à votre fichier appengine-web.xml :

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

Exemple :

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

Émettre une requête HTTP

Vous pouvez émettre une requête HTTP sortante à l'aide de la méthode java.net.URLConnection.

L'extrait de code ci-dessous montre comment envoyer une requête GET HTTP de base. L'application crée un objet URL, puis appelle la méthode openStream() de l'objet pour récupérer le contenu à cette 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();

Pour les requêtes plus avancées, utilisez java.net.HttpURLConnection comme suit :

  1. Créez un objet URL.
  2. Créez un objet URLConnection en appelant la méthode openConnection() de votre objet URL.
  3. Créez un objet HttpURLConnection en castant votre objet URLConnection vers le type d'objet HttpURLConnection.
  4. Définissez la méthode de requête de l'objet HttpURLConnection.
  5. Créez un flux de sortie pour la requête.
  6. Écrivez la charge utile de requête dans le flux.
  7. Fermez le flux.

L'extrait suivant montre comment utiliser HttpURLConnection pour effectuer une requête plus avancée, en envoyant des données à partir d'un formulaire Web via une requête PUT :

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

Définir un délai d'inactivité de requête

Si vous utilisez la récupération d'URL, vous pouvez régler la date limite par défaut pour les requêtes à l'aide du paramètre appengine.api.urlfetch.defaultDeadline dans le fichier appengine-web.xml.

Définir des en-têtes

Si vous utilisez la récupération d'URL, vous pouvez définir un en-tête HTTP par défaut pour la requête sortante, en appelant la méthode setRequestProperty() de votre objet HttpURLConnection. L'extrait suivant définit l'en-tête X-MyApp-Version sur 2.7.3 :

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

Désactiver les redirections

Par défaut, HttpURLConnection suit les redirections HTTP.

Si vous utilisez la récupération d'URL, le service de récupération d'URL sous-jacent suit jusqu'à cinq redirections par défaut. Ces redirections peuvent transférer des informations sensibles, telles que des en-têtes d'autorisation, vers la destination de redirection. Si votre application ne nécessite pas de redirections HTTP, il est recommandé de les désactiver.

Pour désactiver ce comportement, transmettez la valeur false à la méthode setInstanceFollowRedirects() de votre objet HttpURLConnection :

conn.setInstanceFollowRedirects(false);

Si votre application utilise directement le package urlfetch sous-jacent au lieu de java.net, elle doit spécifier doNotFollowRedirects.

Émettre une requête HTTPS

Si vous utilisez la récupération d'URL, émettez une requête HTTPS à l'aide de la classe FetchOptions du package urlfetch et appelez validateCertificate().

Émettre une requête asynchrone

Les requêtes HTTP(S) sont synchrones par défaut. Pour émettre une requête asynchrone, votre application doit utiliser la méthode fetchAsync() de URLFetchService. Cette méthode renvoie un élément java.util.concurrent.Future<HTTPResponse>.

Envoyer une requête à une autre application App Engine

Lors de l'envoi d'une requête à une autre application App Engine, celle-ci doit affirmer son identité en ajoutant l'en-tête X-Appengine-Inbound-Appid à la requête. Si vous indiquez au service de récupération d'URL de ne pas suivre les redirections, App Engine ajoutera automatiquement cet en-tête aux requêtes.

Consultez la section Désactiver les redirections pour obtenir des conseils sur la désactivation des redirections.

Étape suivante

Pour en savoir plus sur le service URL Fetch, y compris sur les en-têtes envoyés dans une requête URL Fetch, consultez la page Requêtes sortantes.