Eine Webadresse, die eine Funktion startet
Ein Schulkiosk will eine Webadresse, /bestellungen/lena, die Lenas Bestellungen zeigt. Niemand will dafür einen eigenen Server betreiben.
Ein API Gateway kann die Webanfrage annehmen und an eine Lambda-Funktion reichen. Die Funktion muss in genau der Form antworten, die das Gateway erwartet, auch wenn die Anfrage falsch ist.
Am Ende dieser Lektion
Notiz
Ich kann die Antwort schreiben, die ein API Gateway von einer Funktion erwartet.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Request | was ein Aufrufer an eine Webadresse sendet | |
| Response | was die Funktion zurücksendet | |
| Statuscode | eine Zahl, die sagt, wie die Anfrage ausging | 404 |
| Header | eine benannte Angabe, die neben dem Body reist | content-type |
| Body | der Haupttext einer Anfrage oder Antwort |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Anfrage kommt herein, eine Antwort geht hinaus
Das Gateway macht aus der Webanfrage ein Event. Die Methode, etwa GET, steht unter requestContext.http.method. Der Pfad steht in rawPath.
Die Funktion gibt ein Dictionary mit drei Teilen zurück: statusCode, headers und body. Der Body muss ein String sein, nehmen Sie also json.dumps. Das sind die dokumentierten Formen, keine Ausgabe eines Stacks von Ihnen.
Run: die kleinste Eingangstür
import json
# Die dokumentierte Form einer HTTP-API-Anfrage, gekürzt.
event = {
"requestContext": {"http": {"method": "GET"}},
"rawPath": "/bestellungen/lena",
"headers": {"accept": "application/json"},
}
def handler(event, context):
methode = event["requestContext"]["http"]["method"]
pfad = event["rawPath"]
daten = {"gefragt_wurde": methode + " " + pfad}
return {"statusCode": 200,
"headers": {"content-type": "application/json"},
"body": json.dumps(daten)}
antwort = handler(event, None)
print(antwort["statusCode"])
print(antwort["body"])
print(type(antwort["body"]).__name__)
# Ändere "GET" im Event in "POST" und führe es noch einmal aus.
Ein Statuscode sagt, wer sich geirrt hat
Eine 2 am Anfang, etwa 200 oder 201, heißt Erfolg. Eine 4, etwa 400 oder 404, heißt, dass der Aufrufer etwas Falsches verlangt hat. Eine 5 heißt, dass die Funktion selbst gescheitert ist.
Eine falsche Anfrage ist kein Absturz. Geben Sie eine 4 mit einem kurzen Fehler im Body zurück. Eine Funktion, die einen Fehler auslöst, gibt dem Aufrufer eine vage 5 und sagt ihm nichts, was er beheben könnte.
Beispiel: die Codes dieser Lektion
| Code | Bedeutung | Zu verwenden, wenn |
|---|---|---|
| 200 | OK | die Daten gefunden und zurückgegeben wurden |
| 201 | Created | eine neue Bestellung gespeichert wurde |
| 400 | Bad request | ein Feld fehlt, falsch ist oder der Body kein gültiges JSON ist |
| 404 | Not found | es den Pfad oder die Bestellung nicht gibt |
| 405 | Method not allowed | der Pfad existiert, die Methode aber nicht |
| 415 | Unsupported media type | der content-type nicht application/json ist |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele lassen die Funktion bei schlechter Eingabe abstürzen. Der Aufrufer bekommt dann einen vagen Serverfehler. Prüfen Sie zuerst die Eingabe. Liegt der Fehler beim Aufrufer, geben Sie eine 4 zurück und sagen Sie, was zu ändern ist. Eine 5 gehört Fehlern, die bei Ihnen liegen.
Run: ein Fehler als Antwort
import json
def antworte(status, daten):
return {"statusCode": status,
"headers": {"content-type": "application/json"},
"body": json.dumps(daten)}
def handler(event, context):
# Ein fehlender Schlüssel ist der Fehler des Aufrufers: antworten Sie 400, stürzen Sie nicht ab.
if "queryStringParameters" not in event:
return antworte(400, {"fehler": "ergaenze ?kunde=name"})
name = event["queryStringParameters"]["kunde"]
return antworte(200, {"hallo": name})
print(handler({"queryStringParameters": {"kunde": "lena"}}, None)["statusCode"])
print(handler({}, None)["statusCode"])
print(handler({}, None)["body"])
# Fügen Sie eine dritte Zeile hinzu, die handler mit {"queryStringParameters": {}} aufruft. Was geschieht?
Die Anfrage sorgfältig lesen
Nicht jeder Schlüssel ist immer da. Ohne Query-String fehlt queryStringParameters ganz im Event. Prüfen Sie mit in, bevor Sie lesen wollen.
Der Body kommt als Text an. Ist isBase64Encoded wahr, ist der Text kodiert, und Sie dekodieren ihn zuerst. Header-Namen kommen in Kleinbuchstaben an, suche also nach content-type.
Run: einen Base64-Body lesen
import json
import base64
event = {
"body": base64.b64encode(b'{"artikel": "tee"}').decode("utf-8"),
"isBase64Encoded": True,
}
text = event["body"]
print(text)
if event["isBase64Encoded"] is True:
text = base64.b64decode(text).decode("utf-8")
print(text)
print(json.loads(text)["artikel"])
# Setzen Sie isBase64Encoded auf False und führen Sie es noch einmal aus. Was geht schief?
Was dieses Modul nicht gelehrt hat
Notiz
Alles hier lief offline in Python, über Antworten in der Form der echten. Sie haben nichts bereitgestellt, sich in kein echtes Konto eingeloggt und keine Rechnung gesehen. Die Kosten, einen Dienst am Laufen zu halten, kamen nicht vor. Das sind die nächsten Schritte, und man lernt sie am besten mit jemandem, der Ihre Konto-Einstellungen prüfen kann.