HTTP(S)-Anfragen senden

Regions-ID

REGION_ID ist ein abgekürzter Code, den Google anhand der Region zuweist, die Sie beim Erstellen Ihrer Anwendung ausgewählt haben. Der Code bezieht sich nicht auf ein Land oder eine Provinz, auch wenn einige Regions-IDs häufig verwendeten Länder- und Provinzcodes ähneln können. Bei Anwendungen, die nach Februar 2020 erstellt wurden, ist REGION_ID.r in den App Engine-URLs enthalten. Bei Anwendungen, die vor diesem Datum erstellt wurden, ist die Regions-ID in der URL optional.

Hier finden Sie weitere Informationen zu Regions-IDs.

Auf dieser Seite wird beschrieben, wie Sie mit URL Fetch für Laufzeiten der zweiten Generation HTTP(S)-Anfragen über Ihre App Engine-Anwendung ausgeben.

Bevor Sie der Anleitung auf dieser Seite folgen, sollten Sie sprachspezifische idiomatische Lösungen verwenden, um HTTP(S)-Anfragen zu senden, bevor Sie URL Fetch verwenden. Der primäre Anwendungsfall für die Verwendung von URL Fetch besteht darin, HTTP(S)-Anfragen an eine andere App Engine-Anwendung zu senden und die Identität Ihrer Anwendung über diese Anfrage zu bestätigen.

Weitere Informationen zu Größenbeschränkungen für Anfragen und dazu, welche Header in einer URL-Abrufanfrage gesendet werden, finden Sie unter Ausgehende Anfragen.

HTTP-Request senden

Wenn Sie URL Fetch zur Ausgabe ausgehender HTTP(S)-Anfragen verwenden möchten, müssen Sie explizit die urlfetch-Bibliothek aufrufen.

Sie können eine der folgenden Bibliotheken verwenden, um eine ausgehende HTTP-Anfrage zu senden:

  • Verwenden Sie für eine bessere Code-Übertragbarkeit die Python-Standardbibliothek urllib.request, um HTTP-Anfragen auszugeben.
  • Verwenden Sie eine Bibliothek eines Drittanbieters, z. B. requests.
  • Rufen Sie explizit die urlfetch-Bibliothek auf und verwenden Sie die urlfetch.fetch-Methode.

urllib.request

Importieren Sie die urllib.request-Bibliothek:

import urllib.request

Verwenden Sie dann urllib.request, um die GET-Anfrage auszuführen:

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

Die folgenden Snippets zeigen, wie Sie mit urlfetch eine grundlegende HTTP-GET-Anfrage ausführen. Importieren Sie zuerst die Bibliothek urlfetch aus dem App Engine-SDK:

from google.appengine.api import urlfetch

Verwenden Sie dann urlfetch, um die GET-Anfrage auszuführen:

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

Im folgenden Snippet wird dargestellt, wie eine komplexere Anfrage ausgeführt wird, indem Daten über eine HTTP-POST-Anfrage mit urlfetch aus einem Webformular gesendet werden:

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

Anfragezeitüberschreitung festlegen

Mit der Funktion urlfetch.set_default_fetch_deadline() können Sie die Standardfrist anpassen. Diese Funktion speichert die neue Standardfrist in einer Thread-lokalen Variablen. Daher muss sie für jeden Request festgelegt werden, z. B. in einer benutzerdefinierten Middleware.

Weiterleitungen deaktivieren

Wenn Sie URL-Abruf verwenden, folgt der zugrunde liegende URL-Abrufdienst standardmäßig bis zu fünf Weiterleitungen. Diese Weiterleitungen können vertrauliche Informationen wie Autorisierungsheader an das Weiterleitungsziel weiterleiten. Wenn Ihre Anwendung keine HTTP-Weiterleitungen erfordert, empfehlen wir, die Weiterleitungen zu deaktivieren.

Damit URL-Abrufdienst keinen Weiterleitungen folgt, legen Sie den follow_redirects-Parameter der fetch-Methode auf False fest.

HTTPS-Request senden

Um eine HTTPS-Anfrage zu senden, setzen Sie beim Aufrufen der urlfetch.fetch()-Methode den Parameter validate_certificate auf true.

Asynchrone Requests senden

HTTP(S)-Requests sind standardmäßig synchron. Ihre Anwendung muss folgende Vorgänge durchführen, um einen asynchronen Request zu senden:

  1. Erstellen Sie ein neues RPC-Objekt mit urlfetch.create_rpc(). Dieses Objekt repräsentiert in nachfolgenden Methodenaufrufen asynchrone Aufrufe.
  2. Rufen Sie urlfetch.make_fetch_call() auf, um die Anfrage zu senden. Diese Methode nutzt das RPC-Objekt und die URL des Anfrageziels als Parameter.
  3. Rufen Sie die Methode get_result() des RPC-Objekts auf. Diese Methode gibt das Ergebnisobjekt zurück, wenn die Anfrage erfolgreich war, und löst eine Ausnahme aus, wenn bei der Anfrage ein Fehler aufgetreten ist.

Die folgenden Snippets veranschaulichen die Ausführung einer einfachen asynchronen Anfrage aus einer Python-Anwendung. Importieren Sie zuerst die Bibliothek urlfetch aus dem App Engine-SDK:

from google.appengine.api import urlfetch

Verwenden Sie dann urlfetch, um die asynchrone Anfrage auszuführen:

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

Anfragezeitüberschreitung festlegen

Wenn Sie ein Zeitlimit für Ihre Anfrage festlegen möchten, legen Sie beim Erstellen des RPC-Objekts den Parameter deadline der Methode urlfetch.create_rpc() fest.

Callback-Funktion verwenden

Sie können eine Callback-Funktion für das RPC-Objekt festlegen. Die Funktion wird aufgerufen, wenn Ihre Anwendung eine Methode für das Objekt aufruft, z. B. wait(), checksuccess() oder get_result(), die das Objekt wartet, bis die Anfrage abgeschlossen ist.

So verwenden Sie eine Callback-Funktion zur Verarbeitung des Ergebnisses Ihres Abrufaufrufs:

  1. Erstellen Sie eine Hilfsfunktion, um den Umfang des Callbacks festzulegen.
  2. Erstellen Sie eine Handler-Funktion, um das Ergebnis des Abrufaufrufs zu verarbeiten.
  3. Legen Sie das Attribut callback des RPC-Objekts auf die Hilfsfunktion fest.

Das folgende Snippet veranschaulicht das Aufrufen einer Callback-Funktion:

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

Requests an andere App Engine-Anwendungen senden

Wenn Sie URL Fetch zum Ausgeben einer Anfrage an eine andere App Engine-Anwendung verwenden, fügt die Anwendung der Anfrage den Header X-Appengine-Inbound-Appid hinzu, um ihre Identität zu bestätigen.

Wenn Sie den URL-Abrufdienst so konfigurieren, dass er keiner Weiterleitung folgt, fügt App Engine diesen Header automatisch zu Anfragen hinzu. Informationen zum Deaktivieren von Weiterleitungen finden Sie unter Weiterleitungen deaktivieren.

Nächste Schritte

Unter Ausgehende Anfragen finden Sie weitere Informationen zu URL Fetch, z. B. zu den Headern, die in einer URL Fetch-Anfrage gesendet werden.