Invio di richieste HTTP(S)

ID regione

REGION_ID è un codice abbreviato assegnato da Google in base alla regione selezionata al momento della creazione dell'app. Non corrisponde a un paese o a una provincia, anche se alcuni ID regione possono apparire simili ai codici di paese e provincia di uso comune. Per le app create dopo febbraio 2020, REGION_ID.r è incluso negli URL di App Engine. Per le app esistenti create prima di questa data, l'ID regione è facoltativo nell'URL.

Scopri di più sugli ID regione.

Questa pagina descrive come emettere richieste HTTP(S) dalla tua app App Engine.

Per impostazione predefinita, App Engine utilizza il servizio di recupero URL per inviare richieste HTTP(S) in uscita.

Per maggiori dettagli sui limiti di dimensioni delle richieste e sulle intestazioni inviate in una richiesta di recupero degli URL, consulta Richieste in uscita.

Se hai configurato l'accesso VPC serverless o se utilizzi l'API Sockets, devi interrompere il recupero degli URL dalla gestione delle richieste. Con il recupero di URL, le richieste alla tua rete VPC o all'API Sockets non vanno a buon fine. Dopo aver disabilitato il recupero URL, la libreria Python standard gestirà le richieste HTTP. Se hai bisogno delle funzionalità fornite da Recupero URL per richieste specifiche, puoi utilizzare la libreria urlfetch direttamente per quelle richieste specifiche.

Emissione di una richiesta HTTP

Per inviare una richiesta HTTP in uscita, utilizza il metodo urlfetch.fetch. Per una migliore portabilità del codice, puoi anche utilizzare le librerie standard Python urllib, urllib2 o httplib per emettere richieste HTTP. Quando utilizzi queste librerie in App Engine, queste eseguono richieste HTTP utilizzando il servizio di recupero URL di App Engine. Puoi anche utilizzare la libreria requests di terze parti, a condizione che la configuri per l'utilizzo di URLFetch.

urlfetch

I seguenti snippet mostrano come eseguire una richiesta HTTP GET di base utilizzando urlfetch. Innanzitutto, importa la libreria urlfetch dall'SDK di App Engine:

from google.appengine.api import urlfetch

Quindi, utilizza urlfetch per eseguire la richiesta 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')

Lo snippet seguente mostra come eseguire una richiesta più avanzata, inviando i dati da un modulo web tramite una richiesta POST HTTP utilizzando 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')

urllib2

I seguenti snippet mostrano come eseguire una richiesta HTTP GET di base utilizzando urllib2. Innanzitutto, importa la libreria urllib2:

import urllib2

Quindi, utilizza urllib2 per eseguire la richiesta GET:

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

richieste

Per utilizzare le richieste, dovrai installare sia requests sia requests-toolbelt seguendo le istruzioni per i fornitori.

Dopo l'installazione, utilizza il modulo requests_toolbelt.adapters.appengine per configurare le richieste per l'utilizzo di URLFetch:

import requests
import requests_toolbelt.adapters.appengine

# Use the App Engine Requests adapter. This makes sure that Requests uses
# URLFetch.
requests_toolbelt.adapters.appengine.monkeypatch()

Dopo la configurazione, puoi utilizzare le richieste normalmente:

url = 'http://www.google.com/humans.txt'
response = requests.get(url)
response.raise_for_status()
return response.text

Per ulteriori informazioni sull'assistenza relativa alle richieste per Google App Engine, consulta la documentazione per urllib3.contrib.appengine e requests_toolbelt.appengine

Impostazione di un timeout della richiesta

Puoi modificare la scadenza predefinita utilizzando la funzione urlfetch.set_default_fetch_deadline(). Questa funzione memorizza la nuova scadenza predefinita in una variabile locale del thread, quindi deve essere impostata per ogni richiesta, ad esempio in un middleware personalizzato.

Disattivazione dei reindirizzamenti

Se utilizzi il servizio di recupero URL, per impostazione predefinita il servizio sottostante di recupero URL segue fino a cinque reindirizzamenti. Questi reindirizzamenti potrebbero inoltrare informazioni sensibili, come le intestazioni di autorizzazione, alla destinazione reindirizzata. Se la tua app non richiede i reindirizzamenti HTTP, ti consigliamo di disabilitare questi ultimi.

Per indicare al servizio di recupero URL di non seguire i reindirizzamenti, imposta il parametro follow_redirects del metodo fetch su False.

Emissione di una richiesta HTTPS

Per inviare una richiesta HTTPS, imposta il parametro validate_certificate su true quando chiami il metodo urlfetch.fetch().

Emissione di una richiesta asincrona

Le richieste HTTP(S) sono sincrone per impostazione predefinita. Per inviare una richiesta asincrona, l'applicazione deve:

  1. Crea un nuovo oggetto RPC utilizzando urlfetch.create_rpc(). Questo oggetto rappresenta la chiamata asincrona nelle chiamate di metodo successive.
  2. Chiama il numero urlfetch.make_fetch_call() per effettuare la richiesta. Questo metodo prende come parametri l'oggetto RPC e l'URL del target della richiesta.
  3. Chiama il metodo get_result() dell'oggetto RPC. Questo metodo restituisce l'oggetto risultato se la richiesta ha esito positivo e genera un'eccezione se si è verificato un errore durante la richiesta.

I seguenti snippet mostrano come effettuare una richiesta asincrona di base da un'applicazione Python. Innanzitutto, importa la libreria urlfetch dall'SDK di App Engine:

from google.appengine.api import urlfetch

Poi, utilizza urlfetch per effettuare la richiesta asincrona:

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

Impostazione di un timeout della richiesta

Per impostare un timeout per la richiesta, imposta il parametro deadline del metodo urlfetch.create_rpc() quando crei l'oggetto RPC.

Uso di una funzione di callback

Puoi definire una funzione di callback per l'oggetto RPC. La funzione verrà chiamata quando l'applicazione chiama un metodo nell'oggetto, ad esempio wait(), checksuccess() o get_result(), che fa sì che l'oggetto attenda il completamento della richiesta.

Per utilizzare una funzione di callback per gestire il risultato della chiamata di recupero:

  1. Crea una funzione helper per definire l'ambito del callback.
  2. Crea una funzione gestore per gestire il risultato della chiamata di recupero.
  3. Imposta l'attributo callback dell'oggetto RPC sulla funzione helper.

Lo snippet seguente mostra come richiamare una funzione di callback:

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

Invio di una richiesta a un'altra app App Engine

Quando invii una richiesta a un'altra app App Engine, questa deve dichiarare la propria identità aggiungendo l'intestazione X-Appengine-Inbound-Appid alla richiesta. Se indichi al servizio di recupero URL di non seguire i reindirizzamenti, App Engine aggiungerà automaticamente questa intestazione alle richieste.

Per istruzioni su come disattivare i reindirizzamenti, consulta l'argomento Disattivazione dei reindirizzamenti.

Passaggi successivi

Scopri di più sul servizio di recupero degli URL, come le intestazioni inviate in una richiesta di recupero degli URL in Richieste in uscita.