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. Il codice non corrispondono a un paese o a una provincia, anche se potrebbero essere visualizzati alcuni ID regione in modo simile ai codici paese e provincia di uso comune. Per le app create dopo il giorno Febbraio 2020, REGION_ID.r è incluso in 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 inviare richieste HTTP(S) da App Engine dell'app.

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

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

Se disponi configurare l'accesso VPC serverless o se utilizzi l'API Sockets, devono interrompere il recupero degli URL dalla gestione delle richieste. Il recupero URL genera richieste alla tua rete VPC o a in caso di errore dell'API Sockets. Dopo aver disabilitato il recupero degli URL, lo standard Python per gestire le richieste HTTP. Se hai bisogno delle funzionalità fornite Recupero URL per richieste specifiche, puoi usare direttamente la libreria urlfetch per queste richieste specifiche.

Invio di una richiesta HTTP

Per inviare una richiesta HTTP in uscita, utilizza il comando urlfetch.fetch . Per migliorare la portabilità del codice, puoi anche utilizzare lo standard Python librerie urllib, urllib2 o httplib per emettere richieste HTTP. Quando utilizzi queste librerie in App Engine, queste eseguono richieste HTTP utilizzando servizio di recupero URL di App Engine. Puoi anche utilizzare la libreria requests di terze parti, purché la configuri per utilizzare URLFetch.

urlfetch

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

from google.appengine.api import urlfetch

Poi, usa urlfetch per eseguire GET richiesta:

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

Il seguente snippet mostra come eseguire una richiesta più avanzata, inviare 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 di base Richiesta di GET tramite urllib2. Innanzitutto, importa la libreria urllib2:

import urllib2

Poi, usa urllib2 per eseguire GET richiesta:

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, devi installare sia requests che requests-toolbelt seguendo le istruzioni per i fornitori.

Dopo l'installazione, utilizza il modulo requests_toolbelt.adapters.appengine per configurare le richieste per utilizzare 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 sulle 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 Funzione urlfetch.set_default_fetch_deadline(). Questa funzione memorizza nuova scadenza predefinita su una variabile thread-local, quindi deve essere impostata per ogni richiesta, ad esempio in un middleware personalizzato.

Disattivazione dei reindirizzamenti

Se utilizzi il recupero URL, il servizio sottostante di recupero URL segue fino a cinque reindirizzamenti per impostazione predefinita. Questi reindirizzamenti potrebbero inoltrare informazioni sensibili, ad esempio come intestazioni di autorizzazione, alla destinazione reindirizzata. Se la tua app non richiedono reindirizzamenti HTTP, si consiglia di disabilitare i reindirizzamenti.

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

Emissione di una richiesta HTTPS

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

Emissione di una richiesta asincrona

Per impostazione predefinita, le richieste HTTP(S) sono sincrone. Per emettere un richiesta, la tua applicazione deve:

  1. Crea un nuovo oggetto RPC utilizzando urlfetch.create_rpc(). Questo oggetto rappresenta la chiamata asincrona nel metodo successivo chiamate.
  2. Chiama urlfetch.make_fetch_call() per effettuare la richiesta. Questo metodo prende l'oggetto RPC e la richiesta l'URL del target come parametri.
  3. Chiama l'oggetto RPC get_result() . 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 rendere un modello asincrono di base da un'applicazione Python. Innanzitutto, importa Libreria urlfetch dall'SDK di App Engine:

from google.appengine.api import urlfetch

Quindi, 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 urlfetch.create_rpc() deadline del metodo quando crei l'oggetto RPC.

Utilizzo di una funzione di callback

Puoi definire una funzione di callback per l'oggetto RPC. La funzione verrà chiamato quando la tua applicazione chiama un metodo come wait(), checksuccess() o get_result(): l'oggetto attende 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 di Google.
  2. Crea una funzione gestore per gestire il risultato della chiamata di recupero.
  3. Imposta l'attributo callback dell'oggetto RPC sulla funzione helper.

Il seguente snippet illustra 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 di App Engine

Quando invii una richiesta a un'altra app di App Engine, la tua app di App Engine 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 sulla disattivazione, consulta Disattivazione dei reindirizzamenti reindirizzamenti.

Passaggi successivi

Scopri di più sul servizio di recupero URL, ad esempio le intestazioni che sono inviati in una richiesta di recupero URL in Richieste in uscita.