Emite solicitudes HTTP(S)

ID de región

REGION_ID es un código abreviado que Google asigna en función de la región que seleccionas cuando creas tu app. El código no corresponde a un país o provincia, aunque algunos ID de región puedan parecer similares a los códigos de país y provincia de uso común. Incluir REGION_ID.r en las URL de App Engine es opcional para las apps existentes, y pronto será obligatorio para todas las apps nuevas.

A fin de garantizar una transición sin problemas, estamos actualizando App Engine con lentitud para usar los ID de región. Si aún no actualizamos tu proyecto de Google Cloud, no verás un ID de región para la app. Dado que el ID es opcional para las apps existentes, no necesitas actualizar las URL ni realizar otros cambios una vez que el ID de región esté disponible para las apps existentes.

Obtén más información acerca de los ID de región.

Esta página describe cómo emitir solicitudes HTTP(S) desde tu aplicación de App Engine.

De forma predeterminada, las aplicaciones que se ejecutan en el entorno de ejecución de Java 8 usan clases estándar de Java para solicitudes HTTP(S), como java.net.HttpURLConnection. Envías solicitudes como lo harías con cualquier otra aplicación de Java. A fin de usar el comportamiento predeterminado, debes habilitar la facturación para tu aplicación; de lo contrario, obtendrás las siguientes excepciones:

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

Usa clases de red de entorno de ejecución estándar

Si usas las clases de red estándar de Java, tu app tendrá acceso a las siguientes funciones:

Usa la recuperación de URL

Si tienes que usar la recuperación de URL en una aplicación de Java 8, agrega la siguiente línea a tu archivo appengine-web.xml:

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

Por ejemplo:

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

Emite una solicitud HTTP

Emite una solicitud HTTP saliente mediante java.net.URLConnection.

En el siguiente fragmento, se muestra cómo realizar una solicitud GET HTTP básica: La aplicación crea un objeto URL nuevo y, luego, llama al método openStream() del objeto para recuperar el contenido en esa 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();

Para solicitudes más avanzadas, usa java.net.HttpURLConnection de la siguiente manera:

  1. Crea un objeto URL nuevo.
  2. Crear un nuevo URLConnection mediante una llamada al método openConnection() del objeto URL.
  3. Crea un objeto HttpURLConnection nuevo mediante la conversión de su objeto URLConnection al tipo de objeto HttpURLConnection.
  4. Configura el método de solicitud del objeto HttpURLConnection.
  5. Crea un flujo de salida para la solicitud.
  6. Escribe la carga útil de la solicitud en el flujo.
  7. Cierra el flujo

En el siguiente fragmento, se muestra cómo usar HttpURLConnection para realizar una solicitud más avanzada y enviar datos desde un formulario web a través de una solicitud 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());
}

Configura el tiempo de espera de una solicitud

Si usas la recuperación de URL, puedes ajustar la fecha límite predeterminada para las solicitudes mediante la configuración appengine.api.urlfetch.defaultDeadline en el archivo appengine-web.xml.

Configura los encabezados

Si usas la recuperación de URL, puedes establecer un encabezado HTTP en la solicitud saliente, con solo llamar al método setRequestProperty() del objeto HttpURLConnection. En el siguiente fragmento, se establece el encabezado X-MyApp-Version como 2.7.3:

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

Inhabilita los redireccionamientos

De forma predeterminada, HttpURLConnection sigue los redireccionamientos HTTP. Si usas la recuperación de URL, el servicio de recuperación de URL subyacente seguirá hasta cinco redireccionamientos. Para inhabilitar este comportamiento, pasa el valor false al método setInstanceFollowRedirects() del objeto HttpURLConnection:

conn.setInstanceFollowRedirects(false);

Si tu app usa el paquete urlfetch subyacente directamente en lugar de java.net, debe especificar doNotFollowRedirects.

Emite una solicitud HTTPS

Si usas la recuperación de URL, emite una solicitud HTTPS con la clase FetchOptions en el paquete urlfetch y llama a validateCertificate().

Emite una solicitud asíncrona

Las solicitudes HTTP(S) son síncronas de manera predeterminada. Para emitir una solicitud asíncrona, tu aplicación debe usar el método fetchAsync() del objeto URLFetchService. En este método, se muestra un java.util.concurrent.Future<HTTPResponse>.

Emite una solicitud a otra app de App Engine

Cuando se emite una solicitud a otra app de App Engine, la tuya debe afirmar su identidad; para eso, agrega el encabezado X-Appengine-Inbound-Appid a la solicitud. Si le indicas al servicio de recuperación de URL que no siga los redireccionamientos, App Engine agregará este encabezado a las solicitudes automáticamente. Consulta Inhabilita redireccionamientos para obtener más orientación.

Qué sigue

Obtén más información sobre el servicio de recuperación de URL, como los encabezados que se envían en una solicitud de recuperación de URL, en Solicitudes de salida.