Emitir solicitudes HTTP(S)

ID de región

El REGION_ID es un código abreviado que Google asigna en función de la región que selecciones al crear tu aplicación. El código no corresponde a un país o provincia, aunque algunos IDs de región pueden parecerse a los códigos de país y provincia que se usan habitualmente. En las aplicaciones creadas después de febrero del 2020, REGION_ID.r se incluye en las URLs de App Engine. En las aplicaciones creadas antes de esa fecha, el ID de región es opcional en la URL.

Más información sobre los IDs de región

En esta página se describe cómo enviar solicitudes HTTP(S) desde tu aplicación de App Engine.

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

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

Usar clases de red de tiempo de ejecución estándar

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

Cómo utilizar la extracción de URL

Si tienes que usar la obtención de URLs en una aplicación Java 8, añade 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>

Enviar una solicitud HTTP

Envías 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 y, a continuación, llama al método openStream() del objeto para obtener el contenido de 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 hacer solicitudes más avanzadas, usa java.net.HttpURLConnection de la siguiente manera:

  1. Crea un objeto URL.
  2. Crea un objeto URLConnection llamando al método openConnection() de tu objeto URL.
  3. Crea un objeto HttpURLConnection convirtiendo tu objeto URLConnection al tipo de objeto HttpURLConnection.
  4. Define 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 la emisión.

En el siguiente fragmento se muestra cómo usar HttpURLConnection para hacer 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());
}

Definir un tiempo de espera de las solicitudes

Si usas URL Fetch, puedes ajustar el plazo predeterminado de las solicitudes con el ajuste appengine.api.urlfetch.defaultDeadline en el archivo appengine-web.xml.

Definir encabezados

Si usas URL Fetch, puedes definir un encabezado HTTP en la solicitud saliente llamando al método setRequestProperty() de tu objeto HttpURLConnection. El siguiente fragmento de código asigna el valor 2.7.3 al encabezado X-MyApp-Version:

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

Inhabilitar redirecciones

De forma predeterminada, HttpURLConnection sigue las redirecciones HTTP.

Si usas URL Fetch, el servicio subyacente de URL Fetch sigue hasta cinco redirecciones de forma predeterminada. Estas redirecciones podrían reenviar información sensible, como encabezados de autorización, al destino de la redirección. Si tu aplicación no requiere redirecciones HTTP, te recomendamos que las inhabilites.

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

conn.setInstanceFollowRedirects(false);

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

Emitir una solicitud HTTPS

De forma predeterminada, el servicio URL Fetch subyacente valida el certificado del host con el que se pone en contacto y rechaza las solicitudes si el certificado no coincide. No es necesario que protejas explícitamente tu solicitud.

Inhabilitar la validación de certificados de host

Para inhabilitar la validación automática de certificados de host en URL Fetch, envía una solicitud HTTPS con la clase FetchOptions del paquete urlfetch y llama a doNotValidateCertificate().

Enviar una solicitud asíncrona

Las solicitudes HTTP(S) son síncronas de forma predeterminada. Para enviar una solicitud asíncrona, tu aplicación debe usar el método fetchAsync() de URLFetchService. Este método devuelve un objeto java.util.concurrent.Future<HTTPResponse>.

Enviar una solicitud a otra aplicación de App Engine

Cuando envíes una solicitud a otra aplicación de App Engine, tu aplicación de App Engine debe afirmar su identidad añadiendo el encabezado X-Appengine-Inbound-Appid a la solicitud. Si le indicas al servicio de obtención de URLs que no siga las redirecciones, App Engine añadirá automáticamente este encabezado a las solicitudes.

Consulta Inhabilitar redirecciones para obtener información sobre cómo inhabilitar redirecciones.

Siguientes pasos

Consulta información sobre el servicio de obtención de URLs, como los encabezados que se envían en una solicitud de obtención de URLs en Solicitudes salientes.