Emitir solicitudes HTTPS

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 con el servicio de obtención de URLs para los tiempos de ejecución de segunda generación.

Antes de seguir las instrucciones de esta página, te recomendamos que uses soluciones idiomáticas de lenguaje para enviar solicitudes HTTP(S) antes de usar el servicio de obtención de URLs. El caso de uso principal de la obtención de URLs es cuando quieres enviar solicitudes HTTP(S) a otra aplicación de App Engine y afirmar la identidad de tu aplicación en esa solicitud.

Para obtener información sobre los límites de tamaño de las solicitudes y los encabezados que se envían en una solicitud de obtención de URL, consulta Solicitudes salientes.

Enviar una solicitud HTTP

Para usar el servicio de obtención de URL para enviar solicitudes HTTP(S) salientes, llama a la biblioteca urlfetch.

Para enviar una solicitud HTTP saliente, usa cualquiera de las siguientes bibliotecas:

  • Para mejorar la portabilidad del código, usa la biblioteca estándar de Python urllib.request para enviar solicitudes HTTP.
  • Usa una biblioteca de terceros, como requests.
  • Llama explícitamente a la biblioteca urlfetch y usa el método urlfetch.fetch.

urllib.request

Importa la biblioteca urllib.request:

import urllib.request

A continuación, usa urllib.request para hacer la solicitud GET:

url = 'http://www.google.com/humans.txt'
try:
    result = urllib.request.urlopen(url)
    self.response.write(result.read())
except urllib.error.URLError:
    logging.exception('Caught exception fetching url')

urlfetch

En los siguientes fragmentos se muestra cómo realizar una solicitud HTTP GET básica con urlfetch. Primero, importa la biblioteca urlfetch del SDK de App Engine:

from google.appengine.api import urlfetch

Usa urlfetch para realizar la solicitud GET:

url = 'http://www.google.com/humans.txt'
try:
    result = urlfetch.fetch(url)
    if result.status_code == 200:
        self.response.write(result.content)
    else:
        self.response.status_code = result.status_code
except urlfetch.Error:
    logging.exception('Caught exception fetching url')

En el siguiente fragmento se muestra cómo hacer una solicitud más avanzada, enviando datos de un formulario web a través de una solicitud HTTP POST mediante urlfetch:

try:
    form_data = urllib.urlencode(UrlPostHandler.form_fields)
    headers = {'Content-Type': 'application/x-www-form-urlencoded'}
    result = urlfetch.fetch(
        url='http://localhost:8080/submit_form',
        payload=form_data,
        method=urlfetch.POST,
        headers=headers)
    self.response.write(result.content)
except urlfetch.Error:
    logging.exception('Caught exception fetching url')

Definir un tiempo de espera de las solicitudes

Ajusta el plazo predeterminado con la función urlfetch.set_default_fetch_deadline(). Esta función almacena el nuevo plazo predeterminado en una variable local del subproceso, por lo que debe definirse para cada solicitud (por ejemplo, en un middleware personalizado).

Inhabilitar redirecciones

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 indicar al servicio de obtención de URLs que no siga las redirecciones, asigna el valor False al parámetro follow_redirects del método fetch.

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.

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 hacer lo siguiente:

  1. Crea un objeto RPC con urlfetch.create_rpc(). Este objeto representa tu llamada asíncrona en llamadas de método posteriores.
  2. Llama al urlfetch.make_fetch_call() para hacer la solicitud. Este método usa tu objeto RPC y la URL del destino de la solicitud como parámetros.
  3. Llama al método get_result() del objeto RPC. Este método devuelve el objeto de resultado si la solicitud se realiza correctamente y genera una excepción si se produce un error durante la solicitud.

En los siguientes fragmentos se muestra cómo hacer una solicitud asíncrona básica desde una aplicación de Python. Primero, importa la biblioteca urlfetch del SDK de App Engine:

from google.appengine.api import urlfetch

A continuación, usa urlfetch para hacer la solicitud asíncrona:

rpc = urlfetch.create_rpc()
urlfetch.make_fetch_call(rpc, 'http://www.google.com/')

# ... do other things ...
try:
    result = rpc.get_result()
    if result.status_code == 200:
        text = result.content
        self.response.write(text)
    else:
        self.response.status_int = result.status_code
        self.response.write('URL returned status code {}'.format(
            result.status_code))
except urlfetch.DownloadError:
    self.response.status_int = 500
    self.response.write('Error fetching URL')

Definir un tiempo de espera de las solicitudes

Para definir un tiempo de espera para tu solicitud, define el parámetro deadline del método urlfetch.create_rpc() al crear tu objeto RPC.

Usar una función de retrollamada

Puedes definir una función de retrollamada para tu objeto RPC. Se llamará a la función cuando tu aplicación llame a un método del objeto (como wait(), checksuccess() o get_result()) que haga que el objeto espere a que se complete la solicitud.

Para usar una función de retrollamada que gestione el resultado de tu llamada de obtención, haz lo siguiente:

  1. Crea una función auxiliar para definir el ámbito de la devolución de llamada.
  2. Crea una función de controlador para gestionar el resultado de tu llamada de obtención.
  3. Asigna el atributo callback del objeto RPC a la función auxiliar.

En el siguiente fragmento se muestra cómo invocar una función de retrollamada:

def handle_result(rpc):
    result = rpc.get_result()
    self.response.write(result.content)
    logging.info('Handling RPC in callback: result {}'.format(result))

urls = ['http://www.google.com',
        'http://www.github.com',
        'http://www.travis-ci.org']
rpcs = []
for url in urls:
    rpc = urlfetch.create_rpc()
    rpc.callback = functools.partial(handle_result, rpc)
    urlfetch.make_fetch_call(rpc, url)
    rpcs.append(rpc)

# ... do other things ...

# Finish all RPCs, and let callbacks process the results.

for rpc in rpcs:
    rpc.wait()

logging.info('Done waiting for RPCs')

Enviar una solicitud a otra aplicación de App Engine

Cuando se usa URL Fetch para enviar una solicitud a otra aplicación de App Engine, la aplicación puede 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.