Émettre des requêtes HTTPS

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) depuis votre application App Engine à l'aide du service de récupération d'URL pour les environnements d'exécution de deuxième génération.

Avant de suivre les instructions de cette page, nous vous recommandons d'utiliser des solutions idiomatiques de langage pour émettre des requêtes HTTP(S) avant d'utiliser le service de récupération d'URL. Le principal cas d'utilisation de la récupération d'URL est lorsque vous souhaitez envoyer des requêtes HTTP(S) à une autre application App Engine et revendiquer l'identité de votre application sur cette requête.

Pour en savoir plus sur les limites de taille des requêtes et les en-têtes envoyés dans une requête de récupération d'URL, consultez Requêtes sortantes.

Par défaut, les applications exécutées dans l'environnement d'exécution Java 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.

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

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

  • La limite de 32 Mo sur les données de requête ne s'applique pas.
  • Compatibilité avec HTTP 2.0
  • Prise en charge de toutes les API basées sur Google Cloudaccessibles à partir des bibliothèques clientes Cloud pour Java.

Utiliser URL Fetch

Si vous devez utiliser la récupération d'URL dans une application Java, 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

Pour émettre des requêtes HTTP(S) sortantes à l'aide du service de récupération d'URL, utilisez 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 et envoyer des données à partir d'un formulaire Web à l'aide d'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 avant expiration de la requête

Si vous utilisez la récupération d'URL, ajustez la date limite par défaut des 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

Par défaut, le service de récupération d'URL sous-jacent valide le certificat de l'hôte qu'il contacte et refuse les requêtes si le certificat n'est pas conforme. Vous n'avez pas besoin de sécuriser explicitement votre demande.

Désactiver la validation du certificat de l'hôte

Pour désactiver la validation automatique du certificat de l'hôte dans URL Fetch, émettez une requête HTTPS à l'aide de la classe FetchOptions du package urlfetch et appelez la méthode doNotValidateCertificate().

É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

Lorsque vous utilisez URL Fetch pour envoyer une requête à une autre application App Engine, votre application peut 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 Désactiver les redirections pour des conseils sur la désactivation des redirections.

Étapes suivantes

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.