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 in Ihrer App Engine-Anwendung HTTP(S)-Anfragen senden.

Standardmäßig verwendet App Engine den URL-Abrufdienst, um ausgehende HTTP(S)-Anfragen zu senden.

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

Wenn Sie den serverlosen VPC-Zugriff eingerichtet haben oder die Sockets API verwenden, müssen Sie URL Fetch an der Bearbeitung von Anfragen hindern. URL Fetch führt dazu, dass Anfragen an Ihr VPC-Netzwerk oder an die Sockets API fehlschlagen. Wenn Sie URL Fetch deaktiviert haben, verarbeitet die Standard-Python-Bibliothek HTTP-Anfragen. Wenn Sie die von URL Fetch bereitgestellten Features für bestimmte Anfragen benötigen, können Sie für diese bestimmten Anfragen die Bibliothek urlfetch direkt verwenden.

HTTP-Request senden

Verwenden Sie die Methode urlfetch.fetch, um eine ausgehende HTTP-Anfrage zu senden. Zur Verbesserung der Codeportabilität können Sie auch die Python-Standardbibliotheken urllib, urllib2 oder httplib verwenden, um HTTP-Anfragen zu senden. Wenn Sie diese Bibliotheken in App Engine verwenden, führen sie HTTP-Requests mithilfe des URL-Abrufdiensts von App Engine aus. Sie können auch die Drittanbieterbibliothek requests verwenden, wenn Sie sie für die Verwendung von URLFetch konfigurieren.

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

urllib2

Die folgenden Snippets zeigen, wie Sie mit urllib2 eine grundlegende HTTP-GET-Anfrage ausführen. Importieren Sie zuerst die Bibliothek urllib2:

import urllib2

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

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

Anfragen

Um Anfragen verwenden zu können, müssen Sie requests und requests-toolbelt mithilfe der Vendoring-Anleitung installieren.

Nach der Installation verwenden Sie das Modul requests_toolbelt.adapters.appengine, um Anfragen zur Verwendung von URLFetch zu konfigurieren:

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

Nach der Konfiguration können Sie Requests normal verwenden:

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

Weitere Informationen zum Google App Engine-Support zu Anfragen finden Sie in der Dokumentation für urllib3.contrib.appengine und requests_toolbelt.appengine

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 eine Anfrage an eine andere App Engine-Anwendung senden, muss die Identität dieser Anwendung bestätigt werden. Geben Sie zusätzlich in die Anfrage den Header X-Appengine-Inbound-Appid ein. 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 zum URL-Abrufdienst, z. B. zu den Headern, die in einer URL-Abrufanfrage gesendet werden.