Emitir 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 eliges cuando creas la app. El código no corresponde a un país ni a una provincia, aunque algunos ID de región puedan parecer similares a los códigos de país y provincia que se suelen usar. En el caso de las apps creadas después de febrero de 2020, REGION_ID.r se incluye en las URL de App Engine. En el caso de las apps existentes creadas antes de esta fecha, el ID de región es opcional en la URL.

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 las solicitudes HTTP(S), como java.net.HttpURLConnection. Las solicitudes se envían como se haría con cualquier otra aplicación de Java. A fin de usar el comportamiento predeterminado, debes habilitar la facturación para la aplicación; de lo contrario, obtendrás las siguientes excepciones:

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

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

Si usas las clases de red estándar de Java, la app tendrá acceso a las siguientes características:

Usa la recuperación de URL

Si tienes que usar la recuperación de URL en una app 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

Debes emitir una solicitud HTTP saliente mediante java.net.URLConnection.

En el siguiente fragmento, se muestra cómo realizar una solicitud HTTP GET 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. Crea un objeto URLConnection nuevo mediante una llamada al método openConnection() del objeto URL.
  3. Crea un objeto HttpURLConnection nuevo mediante la conversión del 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());
}

Cómo configurar 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 mediante una llamada 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 sigue hasta cinco redireccionamientos de forma predeterminada. Estos redireccionamientos podrían reenviar información sensible, como los encabezados de autorización, al destino redireccionado. Si tu app no requiere redireccionamientos HTTP, se recomienda que los inhabilites.

Para inhabilitar este comportamiento, pasa el valor false al método setInstanceFollowRedirects() del objeto HttpURLConnection:

conn.setInstanceFollowRedirects(false);

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

Emite una solicitud HTTPS

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

Emite una solicitud asíncrona

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

Cómo emitir una solicitud dirigida a otra aplicación de App Engine

Cuando se emite una solicitud a otra app de App Engine, la tuya debe afirmar su identidad; para eso, se 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 de manera automática.

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.