Datenaustausch mit Funktionen
Das Aufrufen eines Code Engine-Funktionsdienstes (oder einfach einer Funktion) erfolgt auf der Client-Seite durch HTTP-Anfragen. Die Informationen können auf folgende Weise an die Funktion übergeben werden:
- Als Teil von URL (Pfad und optional Abfrageparameter)
- Durch HTTP Anfrage-Header
- Über den HTTP-Anfragetext
Ein Anrufer erhält diese Werte auf der Client-Seite als Antwort von HTTP. Die Antwortdaten werden wie folgt übermittelt:
- Als HTTP Antwortcode
- Über HTTP Antwort-Header
- Durch den Antworttext von HTTP
Alle Regeln und Funktionen zum Aufrufen einer Funktion über HTTP-Anfragen und die daraus resultierenden HTTP-Antworten sind die externe Datenschnittstelle.
Eine eingehende HTTP-Anfrage wird zur Verarbeitung an den Funktionscode weitergeleitet, wobei die Regeln der internen Anfragedatenschnittstelle angewendet werden. Die Ergebnisse, die der Funktionscode liefert, müssen den Regeln der internen Antwortdatenschnittstelle entsprechen.
Das folgende Diagramm zeigt den Informationsfluss von einem Client, der die externe Datenschnittstelle verwendet. Der Prozess verwendet den Funktionsdienst Code Engine und die interne Anfragedatenschnittstelle zum Funktionscode. Ebenso fließen die resultierenden Daten vom Funktionscode über den Funktionsdienst Code Engine zur internen Antwortdatenschnittstelle und die externe Datenschnittstelle fließt zurück zum Aufrufer.
Schnittstelle für externe Datenanfragen
Die Definition der externen Datenschnittstelle leitet sich von standardisierten HTTP ab.
MIME-Typen
MIME-Typen werden verwendet, um das Format der HTTP-Anforderungsinformationen und der HTTP-Antwort zu definieren.
Die folgenden IANA MIME-Typen werden für den Inhaltstyp (Content-Type) der HTTP-Anfragen oder HTTP-Antworten unterstützt. MIME-Typ-Parameter werden unterstützt, sind aber nicht in dieser Liste enthalten:
- JSON-Typ:
application/json; <parameters>
- Binäre Typen:
audio/*; <parameters>application/octet-stream; <parameters>example/*; <parameters>font/*; <parameters>image/*; <parameters>model/*; <parameters>multipart/*; <parameters>video/*; <parameters>
- Textarten:
text/plain; <parameters>text/html; <parameters>text/*; <parameters>
- Prozentual kodierter Typ:
application/x-www-form-urlencoded; <parameters>
Anforderungsdaten
Wenn eine Funktion aufgerufen wird, kann sie beliebige Daten (Anforderungsnutzlast) in Text- oder Binärform empfangen. Das Vorhandensein eines Content-Type-Werts im HTTP-Anforderungsheader bestimmt die Form und Kodierung der Daten,
die an die Funktion gesendet werden. Die Datenstruktur, das Format und der Inhaltstyp müssen übereinstimmen. Der Code Engine-Funktionsdienst führt eine minimale Validierungsprüfung der Daten durch, indem er den Inhaltstyp berücksichtigt,
und antwortet in bestimmten Fällen mit dem HTTP-Statuscode 400, z. B. wenn das JSON-Datenformat oder die Kodierung ungültig ist.
Bei allen anderen ausgewählten " Content-Type wird erwartet, dass das Datenformat den Einschränkungen des MIME-Typs entspricht.
Bereitstellung von Anfragedaten als Abfrageparameter
Anforderungsdaten können als Schlüssel-Wert-Paare im URL-codierten Format (auch als prozentcodiert bezeichnet) in den HTTP URL bereitgestellt werden.
Prozentkodierung wird in der Webtechnologie häufig verwendet. Alle 8-Bit-Zeichen werden als Hexadezimalwerte geschrieben, denen ein Prozentzeichen (%) vorangestellt ist. Diese Art der Codierung wird auch als URL-Codierung bezeichnet.
Beispiel für den Aufruf einer Funktion mit Hilfe von Abfrageparametern:
curl -v "https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud/?planet1=Mars&planet2=Jupiter"
Bereitstellung von Anfragedaten im Hauptteil der Anfrage
Die angeforderten Daten werden im Textteil der Anfrage an HTTP bereitgestellt. Das Format der Daten muss mit dem angegebenen " Content-Type übereinstimmen.
Beispiele für den Aufruf einer Funktion mit Hilfe von Body-Daten unter UNIX®:
curl -v -H "Content-Type: application/x-www-form-urlencoded" -d 'location=planet%20earth' https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud
curl -v -H "Content-Type: application/json" -d "{'planet1': 'Mars', 'planet2': 'Jupiter'}" https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud
Beispiel für das Aufrufen einer Funktion unter Verwendung von Body-Daten in Windows™:
curl -v -H "Content-Type: application/json" -d "{\"key_1\":\"Mars\",\"planet2\":\"Jupiter\"}" "https://function-nodejs-95.1057yuwab63w.us-east.codeengine.appdomain.cloud"
Fehlt bei einer Anfrage der Wert " Content-Type ", behandelt Code Engine die Daten-Nutzlast wie für " application/json beschrieben.
Bereitstellung von Kopfdaten der Anfrage
Die Anforderungsdaten werden in Schlüssel-Wert-Paaren im Kopfbereich der HTTP-Anfrage bereitgestellt.
Beispiel für den Aufruf einer Funktion mit Hilfe von Kopffeldern:
curl -v -H "Sample_Data: Sample_Value" https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud
Bereitstellung von gemischten Daten auf Anfrage
Code Engine funktionen unterstützen die Verwendung verschiedener Methoden zur Bereitstellung von Anfragedaten innerhalb einer einzigen HTTP-Anfrage.
Beispiel für den Aufruf einer Funktion unter Verwendung von Body-Daten und Header-Feldern:
curl -v -H "Sample_Data: Sample_Value" -H "Content-Type: application/x-www-form-urlencoded" -d 'planet1=Mars&planet2=Jupiter' https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud
Beispiel für den Aufruf einer Funktion unter Verwendung von Body-Daten, Kopfzeilen und Abfrageparametern:
curl -v -H "Sample_Data: Sample_Value" -H "Content-Type: application/x-www-form-urlencoded" -d 'planet1=Mars&planet2=Jupiter' https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud/?planet1=Mars&planet2=Jupiter
Interne Schnittstelle für Anfragedaten
Die interne Anfragedatenschnittstelle beschreibt, wie der Funktionsdienst Code Engine Anfragedaten, die über die externe Datenschnittstelle empfangen werden, an den Funktionscode liefert. Unabhängig von der Programmiersprache können Sie die Funktionslogik so implementieren, dass alle Anforderungsparameter in der main()-Funktion als erster Parameter erscheinen.
Sie können für diesen Parameter einen beliebigen Namen verwenden; in den folgenden Beispielen heißt der Parameter " args.
Außerdem erhält der Funktionscode eine Reihe von automatisch eingefügten vordefinierten Umgebungsvariablen.
Python-Beispiel:
import os
def main(args):
# raw_input_data = args.__ce_body; # uncomment this line if client is providing data in the request body
all_input=args;
env=dict(os.environ)
print("Return body:",all_input)
return {
"statusCode": 200,
"body" : all_input,
}
Node.js beispiel:
function main(args) {
const body = {
args,
env: process.env,
};
console.log(`Return body: ${JSON.stringify(body, null, 2)}`);
return {
statusCode: 200,
"body" : body,
};
}
module.exports.main = main;
Der Funktionsdienst Code Engine verwendet verschiedene Kodierungen für die Eingabedaten, um sicherzustellen, dass der Funktionscode auf die Eingabedaten im Argument " args zugreifen kann. Mit Hilfe der Kodierungen wird sichergestellt,
dass strukturierte Daten, Klartext, Daten und binäre Daten Teil der Eingabedaten sein können.
Textkodierung
Die Textkodierung wird für Elemente im Eingabeparameter " args verwendet, die Text-Nutzdaten enthalten. Die Kodierung ist notwendig, um sicherzustellen, dass Sonderzeichen nicht überlesen werden und die Datenstruktur des
Parameters " args nicht beschädigen.
Code Engine führt die Kodierung des Textinhalts aus, bevor es die main()-Funktion aufruft. Die Programmlogik der Funktion muss diese möglicherweise entschlüsseln, um die ursprünglichen Daten wiederherzustellen.
Unterstützte Escape-Zeichen:
- Die Rücktaste wird ersetzt durch
\b. - Der Seitenvorschub wird ersetzt durch
\f. - Newline wird ersetzt durch
\n. - Der Wagenrücklauf wird ersetzt durch
\r. - Tab wird ersetzt durch
\t. - Doppelte Anführungszeichen werden ersetzt durch
\". - Backslash wird durch
\\ersetzt.
Base64-Codierung
Base64 wird für Elemente im Eingabeparameter " args verwendet, die die interne Datenstruktur des Parameters " args aufbrechen können. Durch die Base64 wird sichergestellt, dass der gesamte Wert nur aus
lesbaren Zeichen in einem 64-Zeichen-Alphabet besteht.
Zum Beispiel:
"eyAicGxhbmV0MSI6Ik1hcnMiLCAicGxhbmV0MiI6Ikp1cGl0ZXIiIH0="
Prozentkodierung ( URL-Kodierung)
Prozentkodierung wird in der Webtechnologie häufig verwendet. Alle 8-Bit-Zeichen werden als Hexadezimalwert geschrieben, dem ein Prozentzeichen (%) vorangestellt wird. Diese Art der Codierung wird auch als URL-Codierung bezeichnet. Die Funktion
empfängt die Daten vom Typ " form-urlencoded im Rohformat im Parameter " __ce_body.
Der Funktionsdienst Code Engine übergibt die Abfrageparameter unverändert (das führende " ? ist nicht Teil davon) in das Feld " __ce_query des Parameters " args. Auf diese Weise erhält
der Funktionscode diesen Parameter im URL-codierten Format; zum Beispiel:
"x%5cb=1%22f4%20and%20"
Der Parameter " args
Der Parameter " args ist eine sprachspezifische Datenstruktur (JSON-Objekt für Node.js und Typ " dict (Wörterbuch) für Python), die mit den Eingabedaten der Anfrage im folgenden Format gefüllt wird:
| Elemente der obersten Ebene | Beschreibung |
|---|---|
__ce_<service_variable> |
Code Engine dienstinternes Eingangsargument. |
__ce_headers |
Eine Kopie des HTTP-Anforderungs-Header-Elements. |
<property> (optional) |
Top-Level-Eigenschaften verfügbar, wenn die Eingabedaten für HTTP in einem strukturierten Format bereitgestellt werden (nur wenn ein Inhaltstyp von application/json verwendet wird). |
{: caption="Elemente für den Parameter ' args "} |
{
"args": {
"__ce_body": "eyAicGxhbmV0MSI6Ik1hcnMiLCAicGxhbmV0MiI6Ikp1cGl0ZXIiIH0=",
"__ce_headers": {
"Accept": "*/*",
"User-Agent": "curl/7.58.0",
"X-Request-Id": "d03a1af0-bfc8-4a50-be7d-a72040c02cc9",
"Content-Type": "application/json",
},
"__ce_method": "GET",
"__ce_path": "/",
"__ce_query": "",
"planet1": "Mars",
"planet2": "Jupiter"
}
}
parameter args für interne Eingabeargumente gesetzt (__ce_*)
Der Funktionsdienst Code Engine injiziert reservierte Eingabeargumente in die Eingabedaten " args.
Die folgenden Parameter können im Argument " args erscheinen, je nachdem, wie der Aufrufer die Anfragedaten bereitstellt:
| Parametername | Werttyp | Beschreibung |
|---|---|---|
__ce_method |
Zeichenfolge | Die HTTP-Anfragemethode (entweder eine GET- oder POST-Anfrage). |
__ce_headers |
Karte mit Schlüssel-Wert-Paaren | Schlüssel-Wert-Paare des HTTP-Anfrageheaders. |
__ce_path |
Zeichenfolge | URL pfad der eingehenden HTTP-Anfrage. |
__ce_body |
Zeichenfolge | Die Entität des Anforderungstexts alsBase64-encoded Zeichenfolge, wenn der Anforderungsinhaltstyp binär ist, andernfalls als einfache Zeichenfolge. |
__ce_query |
Zeichenfolge | Die Abfrageparameter aus der Anforderung als nicht geparste Zeichenfolge. Der Parameter __ce_query ist eine einzelne Zeichenkette, die die Abfrageparameter enthält, die aus URL analysiert werden, ohne das führende Fragezeichen
(?) und getrennt durch ein kaufmännisches Und-Zeichen (&). |
Die internen __ce_*-Parameter können nicht mit Anfragedaten überschrieben werden, die in der HTTP-Anfrage bereitgestellt werden. HTTP aufrufe, die versuchen, zu überschreiben, schlagen fehl mit dem Statuscode 400 (Bad Request).
Inhalt des ' args-Parameters, wenn ein Aufrufer die Anfragedaten über Abfrageparameter bereitstellt
Eine Funktion empfängt Abfrageparameterdaten als Schlüssel-Wert-Paare im __ce_query-Parameter und ist prozentcodiert ( URL-codiert). Außerdem ist jeder einzelne Abfrageparameter ein Schlüssel-Wert-Paar im entschlüsselten Format:
Feld args |
Ist das eingestellt? | Beschreibung |
|---|---|---|
__ce_body |
Nein | Body |
__ce_headers |
Ja | Header ohne Inhaltstyp |
__ce_query |
Ja | Abfrageparameter ( URL-verschlüsselt) |
| Top-Level-Eigenschaft | Ja | Schlüssel-Wert-Paar ( URL – dekodiert und textkodiert) |
Python für den Zugriff auf Abfrageparameter:
import os
def main(args):
query_parm_1 = args.get("key", "default_value") # get the value of one query parameter
try:
query = args["__ce_query"] # get all query parms
except:
query= "not part of request"
return {
"statusCode": 200,
"body": query,
}
Node.js für den Zugriff auf Abfrageparameter:
function main(args) {
var query_parm_1 = args.key // get the value of one query parameter
var query = args.__ce_query // get all query parameters
return {
statusCode: 200,
"body" : query,
};
}
module.exports.main = main;
Inhalt des Parameters ' args, wenn ein Aufrufer Anfragedaten durch Kopfdaten bereitstellt
Eine Funktion erhält Anforderungskopfdaten als Schlüssel-Wert-Paare im Parameter " __ce_headers. Das Schlüssel-Wert-Paar wird in ein kanonisches Format konvertiert, unabhängig davon, in welchem Format der Schlüssel an der
externen Datenschnittstelle eingestellt ist. Zum Beispiel werden sowohl " mykey als auch " MYKEY in " Mykey" umgewandelt:
Feld args |
Ist das eingestellt? | Beschreibung |
|---|---|---|
__ce_body |
Nein | Body |
__ce_headers |
Ja | Kopfzeile als Schlüssel-Wert-Paar (textkodiert) (Schlüssel ist im kanonischen Format). |
__ce_query |
"" | Der Abfrageparameter ist eine leere Zeichenkette. |
| Top-Level-Eigenschaft | Nein |
Python für den Zugriff auf Kopfdaten:
import os
def main(args):
try:
header = args["__ce_headers"] # get complete header
# value_1 = args["__ce_headers"]["Key_1"] # get value of the Header parm with "Key_1"
except:
header = "not part of request"
return {
"statusCode": 200,
"body": header,
}
Node.js für den Zugriff auf Kopfdaten:
function main(args) {
// var header_parm_1 = args.__ce_headers.Key_1 //get the value of one header parameter
var header = args.__ce_headers // get all header parameters
return {
statusCode: 200,
"body" : header,
};
}
module.exports.main = main;
parameter args aus Anfragedaten des Inhaltstyps ' application/json
Eine Funktion empfängt die Schlüssel und Werte des JSON-Dokuments als dedizierte Eigenschaftsparameter der obersten Ebene.
Wenn in der HTTP-Anfrage kein Wert für Content-type festgelegt ist, verwendet die Code Engine-Funktion standardmäßig application/json.
Darüber hinaus wird der Funktion die JSON-Nutzlast im Parameter " __ce_body " in Base64-encoded Format zur Verfügung gestellt (als Byte-Array).
Feld args |
Ist das eingestellt? | Beschreibung |
|---|---|---|
__ce_body |
Ja | AnfragedatenBase64-encoded) |
__ce_headers |
Ja | Inhaltstyp ist eingestellt |
__ce_query |
"" | Leere Zeichenfolge |
| Top-Level-Eigenschaft | Ja | Schlüssel-Wert-Paar für jedes Element der obersten Ebene (textkodiert) |
Python für den Zugriff auf die Eingabedaten von " application/json:
import os
def main(args):
try:
body_encoded = args["__ce_body"] # get complete header (base64 encoded)
value_1 = args["key_1"] # get value of the Header parm with "key_1"
except:
value_1 = "not part of request"
return {
"statusCode": 200,
"body": value_1,
}
Node.js für den Zugriff auf " application/json:
function main(args) {
var body = args.__ce_body // get complete request body (base64 encoded)
var value_1 = args.key_1 // get value of one single key
return {
statusCode: 200,
"body" : value_1,
};
}
module.exports.main = main;
parameter args aus Anfragedaten des Inhaltstyps ' application/octet-stream
Eine Funktion empfängt Binärdaten im Base64-encoded Format für die Binärdaten " __ce_body im Parameter " __ce_body:
Feld args |
Ist das eingestellt? | Beschreibung |
|---|---|---|
__ce_body |
Ja | AnfragedatenBase64-encoded) |
__ce_headers |
Ja | Inhaltstyp ist eingestellt |
__ce_query |
"" | Leere Zeichenfolge |
| Top-Level-Eigenschaft | Nein |
Python für den Zugriff auf die Eingabedaten von " application/octet-stream:
import os
import base64
def main(args):
try:
body = base64.b64decode(args['__ce_body']).decode("utf-8") # read binary data into the body variable
except:
body = "not binary data found"
return {
"headers": { "Content-Type": "text/plain" }, # text/plain, if ensured binary data do not conain backslash and double quotes
"statusCode": 200,
"body": body,
}
Node.js für den Zugriff auf " application/octet-stream:
function main(args) {
var base64EncodedBody = args.__ce_body // get complete request body (base64 encoded)
var body = Buffer.from(args.__ce_body, 'base64').toString('utf-8') // read binary data into the body variable
return {
statusCode: 200,
"body" : body,
};
}
module.exports.main = main;
parameter args aus Anfragedaten des Inhaltstyps ' text/plain
Eine Funktion empfängt Daten vom Typ Text im Base64-encoded Format im Parameter " __ce_body:
Feld args |
Ist das eingestellt? | Beschreibung |
|---|---|---|
__ce_body |
Ja | Anfragedaten (textkodiert) |
__ce_headers |
Ja | Inhaltstyp ist eingestellt |
__ce_query |
"" | Leere Zeichenfolge |
| Top-Level-Eigenschaft | Nein |
Die Programmlogik der Funktion muss diese möglicherweise entschlüsseln, um die ursprünglichen Daten wiederherzustellen.
Python für den Zugriff auf die Eingabedaten von " text/plain:
import os
def main(args):
body = args['__ce_body'] # get request body, is text encoded (escaped)
return {
"headers": { "Content-Type": "text/plain" },
"statusCode": 200,
"body": body,
}
Node.js für den Zugriff auf " text/plain:
function main(args) {
var body = args.__ce_body // get complete request body (text encoded)
return {
statusCode: 200,
"body" : body,
};
}
module.exports.main = main;
parameter args aus Anfragedaten des Inhaltstyps ' application/x-www-form-urlencoded
Eine Funktion empfängt die vollständigen Körperdaten in textkodiertem Format im Parameter " __ce_body:
Feld args |
Ist das eingestellt? | Beschreibung |
|---|---|---|
__ce_body |
Ja | Anfragedaten (textkodiert) |
__ce_headers |
Ja | Inhaltstyp ist eingestellt |
__ce_query |
"" | Leere Zeichenfolge |
| Top-Level-Eigenschaft | Nein |
Python für den Zugriff auf die Eingabedaten von " application/x-www-form-urlencoded:
import os
def main(args):
body = args['__ce_body'] # get request body, is url-encoded (%)
return {
"headers": { "Content-Type": "text/plain" },
"statusCode": 200,
"body": body,
}
Node.js für den Zugriff auf " application/x-www-form-urlencoded:
function main(args) {
var body = args.__ce_body //get request body, is url-encoded (%)
return {
statusCode: 200,
"body" : body,
};
}
module.exports.main = main;
parameter args aus Anfragedaten des Inhaltstyps ' application/x-www-form-urlencoded und Abfrageparametern
Alle Kombinationen gemischter Datentypen sind möglich, aber beachten Sie, dass bei HTTP-Anfragen mit URL-Abfrageparametern und Textparametern die Textparameter Vorrang vor den Abfrageparametern haben.
Code Engine Funktionsumgebungsvariablen
Während Funktionsaufrufparameter aus der eingehenden HTTP-Anfrage abgeleitet werden, hat eine Code Engine-Funktion auch Zugriff auf eine Reihe von vordefinierten Umgebungsvariablen, die aus Systemeinstellungen abgeleitet werden:
- CE_ALLOW_CONCURRENT
- CE_API_BASE_URL
- CE_DOMAIN
- CE_EXECUTION_ENV
- CE_FUNKTION
- CE_PROJEKT_ID
- CE_REGION
- CE_SUBDOMAIN
Weitere Informationen zu diesen Umgebungsvariablen finden Sie unter Automatisch eingefügte Umgebungsvariablen.
Python für den Zugriff auf Umgebungsvariablen:
import os
def main(args):
curEnv=dict(os.environ)
return {
"headers": { "Content-Type": "application/json" },
"statusCode": 200,
"body": {
"env": curEnv,
}
}
Node.js für den Zugriff auf Umgebungsvariablen:
function main(args) {
var curEnv = process.env; //read the function's env vars
return {
"headers": { "Content-Type": "application/json" },
"statusCode": 200,
"body": {
"env": curEnv,
}
};
}
module.exports.main = main;
Interne Antwortdatenschnittstelle
Die interne Antwortdatenschnittstelle zeigt, wie der Funktionscode Antwortdaten liefert. Der Code Engine-Funktionsdienst verarbeitet die Daten und sendet dem Anrufer eine HTTP-Antwort.
Unabhängig von der Programmiersprache muss der Funktionscode die Antwortdaten als Datenstruktur in der Rückgabeanweisung bereitstellen.
Abhängig von der Programmiersprache ist das Ergebnisobjekt entweder ein JSON-Objekt (SpracheNode.js ) oder ein Wörterbuch (SprachePython ) mit folgender Struktur:
| Funktionen Ergebnisdaten | Anforderungen | Beschreibung |
|---|---|---|
headers |
Optionale | Ein Ergebnisobjekt, bei dem die Schlüssel Kopfnamen und die Werte Zeichenketten, Zahlen oder boolesche Werte sind. Um mehrere Werte für eine einzelne Kopfzeile zu senden, ist der Wert der Kopfzeile ein Array der mehreren Werte. Standardmäßig sind keine Header festgelegt. |
statusCode |
Sollte (Standardwert 200) | Ein gültiger HTTP-Statuscode. |
body |
Optional (Standard: leer) | Eine Zeichenfolge, bei der es sich entweder um reinen Text, ein JSON-Objekt oder -Array oder eine Base64-encoded Zeichenfolge für Binärdaten handelt. Der Körper gilt als leer, wenn er null, eine leere Zeichenkette ("") oder undefiniert ist. |
Beispiel für eine Ergebnisdatenstruktur zur Bereitstellung von Ergebnisdaten der Funktionsausführung:
import os
def main(args):
return {
headers: {
"content_type" : "application/json" ,
"key" , "value"
},
"statusCode": 200,
body: {"myMessage" : "sample message"}
}
Stellen Sie immer ' body und ' statusCode ein. Die implizite Angabe von ' statusCode und body ist nur aus Kompatibilitätsgründen zu veralteten Code Engine verfügbar.
headers -Element
Der Hauptzweck des Header-Abschnitts besteht darin, den Inhaltstyp zu definieren, in dem die Funktion die Antwortdaten bereitstellen wird. Die Ergebnisdaten unterstützen den identischen " MIME-Type, der auf Anfrage akzeptiert
wird.
Je nach dem Wert von " Content-Type muss das Feld "body" in der Ergebnisstruktur die folgenden Aspekte enthalten:
| Inhaltstyp | Wert, der dem body-Element zugewiesen wird | Beispiel |
|---|---|---|
application/json |
JSON-Objekt | body : { key_1: val1 } |
| Nicht festgelegt (Standard) | Zeichenfolge | body : "some text" |
text/* |
Zeichenfolge | body : "some text" |
audio/*, example/*, font/', image/*, video/*, und alle übrigen Typen |
Base64-encoded | body: "SGVsbG8gV29ybGQhCg==" |
Der Funktionscode kann auch Schlüssel-Wert-Paare im Antwort-Header HTTP verwenden, um Antwortdaten bereitzustellen. Daher muss der Code einen eindeutigen Schlüsselnamen und seinen Wert in den Header-Abschnitt der Datenstruktur aufnehmen, die in der Rückgabeanweisung verwendet wird.
Beachten Sie diese wichtigen Überlegungen zum Namen:
- Bei den Schlüsselnamen wird die Groß- und Kleinschreibung nicht berücksichtigt
- Die jüngste Wertzuweisung identischer Schlüsselnamen wird verwendet
- Backslashes oder Leerzeichen werden nicht unterstützt
Beachten Sie diese Wertüberlegungen:
- Werte müssen textkodiert sein
- Die Werte müssen vom Datentyp string oder array of string sein
Beispiel für die Rückgabe von Antwortdaten als Schlüssel-Wert-Paar in der Kopfzeile:
import os
def main(args):
return {
"headers": {
"Content-Type": "text/plain",
"key_1" : "sample_value",
},
"statusCode": 200,
"body": "" ,
}
statusCode -Element
Der Funktionscode muss explizit einen Statuscode setzen (standardmäßig ' 200), um den Aufrufer über das Ausführungsergebnis zu informieren. Sie können jeden gültigen HTTP-Rückgabestatuscode verwenden (d. h. Statuscode 200 an 599).
Der Funktionsdienst Code Engine gibt den Funktionsstatuscode im Header-Feld (x-faas-actionstatus) und als HTTP-Statuscode zurück.
Wenn die E-Mail-Adresse statusCode ungültig ist, gibt der Code Engine-Funktionsdienst den HTTP-Rückgabecode 422 (Ungültiger Funktionscode kann nicht verarbeitet werden) ohne das x-faas-actionstatus-Headerfeld
und ohne zusätzliche Antwortdaten zurück.
Wenn die Größenbeschränkung für Funktionen erreicht ist, wird ein HTTP-Statuscode von 400 an den Kunden zurückgegeben.
Beispiel für die Rückgabe des Antwortstatuscodes:
import os
def main(args):
return {
"statusCode": 200,
"body": "" ,
}
body -Element
Der Funktionscode kann den Abschnitt " body der Rückgabedatenstruktur enthalten, um die Antwortdaten der Funktion bereitzustellen. Der Funktionscode ist dafür verantwortlich, das Element " body in der Rückgabedatenstruktur
im passenden Format an den " Content-Type zu liefern. Fehlt die Funktionsantwort ' Content-Type, so liefert der Funktionscode an der externen Schnittstelle ' Content-Type: text/plain; charset=utf-8 und die Daten aus dem Feld ' body in unveränderter Form zurück.
Je nach verwendetem Inhaltstyp sind die folgenden Regeln für den Textkörper zu beachten.
Körperwert des Inhaltstyps ' application/json
Der Funktionscode muss den Wert des Elements " body als gültige DatenstrukturNodeJs-JSON oder Python) liefern. Die Schlüssel und Werte der Datenstruktur müssen den Syntaxregeln von JSON entsprechen, damit der Code Engine-Dienst
die Antwortdaten im application/json HTTP-Antwortdatenabschnitt bereitstellen kann.
Backslashes (\) und doppelte Anführungszeichen (") in der Datenstruktur werden im Antwortdatenabschnitt von HTTP in einem textcodierten Format übermittelt.
Python für eine ' application/json:
import os
def main(args):
# python dictionary
result_body = { "key_1" : "myfolder\myFile" }
return {
"headers": {
"Content-Type": "application/json",
},
"statusCode": 200,
"body": result_body,
}
Node.js für eine ' application/json:
function main(args) {
// JSON data structure
// Note: Backslash must be text encoded
result_body = { "key1" : "myfolder\\myFile"}
return {
statusCode: 200,
headers: {
'Content-Type': "application/json",
},
"body" : result_body ,
};
}
module.exports.main = main;
Körperwert des Inhaltstyps ' application/octet-stream
Die Ergebnisdaten für den Funktionscode müssen Base64-encoded sein, bevor Sie sie der Ergebnisstruktur hinzufügen.
Python für eine ' application/octet-stream:
import os
import base64
def main(args):
result_body = "myfolder_myFile"
enc_result_body=base64.encodebytes(result_body.encode()).decode("utf-8").strip()
return {
"headers": {
"Content-Type": "application/octet-stream",
},
"statusCode": 200,
"body": enc_result_body,
}
Node.js für eine ' application/octet-stream:
function main(args) {
var result_body = "###\unreturned body###\n"
var buff = new Buffer(result_body , 'utf8');
return {
statusCode: 200,
headers: {
'Content-Type': "application/octet-stream",
},
"body" : buff.toString('base64') ,
};
}
module.exports.main = main;
Körperwert des Inhaltstyps ' text/plain
Der Funktionscode muss die gesamte Antwort in einer einzigen Zeichenfolge enthalten. Der Funktionsdienst Code Engine prüft die Antwortdaten nicht; die Daten werden wie vorgesehen an den Aufrufer übermittelt.
Python für eine ' text/plain:
def main(args):
result_body = "myfolder_myFile"
return {
"headers": {
"Content-Type": "text/plain;charset=utf-8",
},
"statusCode": 200,
"body": result_body,
}
Body-Wert des Content-Typs ' application/x-www-form-urlencoded (prozentual verschlüsselter Inhalt)
Der Funktionscode muss sicherstellen, dass die Antwortdaten vor dem Hinzufügen zur Ergebnisdatenstruktur URL-codiert werden. Der Code Engine-Funktionsdienst überprüft die Antwortdaten nicht auf korrekte Syntax. Die Daten werden wie vorgesehen an den Anrufer übermittelt.
Python für eine ' application/x-www-form-urlencoded:
import os
def main(args):
result_body = "myfolder%20myFile"
return {
"headers": {
"Content-Type": "application/x-www-form-urlencoded",
},
"statusCode": 200,
"body": result_body,
}
Schnittstelle für externe Antwortdaten
Die Definition der externen Datenschnittstelle leitet sich von standardisierten HTTP ab. MIME-Typen im Antwort-Header von HTTP werden verwendet, um das Format der Antwort von HTTP zu definieren.
MIME-Typen
Wenn Code Engine Daten an die externe Welt zurückgibt, können die Funktionen Code Engine die gleichen IANA-MIME-Typen unterstützen, wie in MIME-Typen beschrieben.
Antwortdaten
Die externe Datenschnittstelle gibt die Antwortdatenstruktur als HTTP-Header, HTTP-Statuscode und HTTP-Antwortdaten an den Aufrufer der Funktion zurück.
HTTP-Header-Felder
Der Header von HTTP enthält alle Schlüssel-Wert-Paare, die der Funktionscode zur Ergebnisdatenstruktur hinzugefügt hat.
Der Funktionsdienst Code Engine fügt die folgenden Schlüssel-Wert-Paare hinzu:
| Feldname | Beschreibung |
|---|---|
x-request-id |
Die externe Anforderungs-ID für die aufgerufene Funktion. |
x-faas-activation-id |
Die Code Engine Funktionen dienstinterne ID für den Aufruf. |
x-faas-actionstatus |
Der Statuscode ist der eingestellte Funktionscode. |
Die Namen der Kopfzeilenschlüssel werden immer in Kleinbuchstaben wiedergegeben.
HTTP-Statuscode
Der Ursprung des Statuscodes HTTP kann der Funktionsdienst Code Engine selbst oder der durch den Funktionscode festgelegte Statuscode sein. Das Vorhandensein des Header-Feldes " x-faas-statuscode ist der Indikator für den
Ursprung.
Die Bedeutung des HTTP-Statuscodes kann in der Code Engine-Funktionsdokumentation nachgelesen werden, wenn das x-faas-actionstatus-Header-Feld nicht gesetzt ist. Wenn das Header-Feld jedoch festgelegt ist, definiert die Logik
der Funktion die Bedeutung des HTTP-Statuscodes.
Code Engine die Funktion "service runs" führt eine eingeschränkte Gültigkeitsprüfung der Antwortdaten und des Inhaltstyps durch und gibt einen HTTP-Statuscode von 400 zurück, wenn das Datenformat oder die Codierung
(generiert durch den Funktionscode) ungültig ist.
HTTP antwortdaten
Die Antwortdaten von HTTP auf der externen Datenschnittstelle sind identisch mit den in der Ergebnisdatenstruktur vom Funktionscode gelieferten Daten. Nur wenn " MIME-Type " application/json ist, werden
der Schlüssel und die Werte in der bereitgestellten JSON-Antwort geändert. Alle Backslashes und doppelten Anführungszeichen werden escaped.
Der Anrufer erhält zum Beispiel die Antwortdaten " application/json. Der Funktionscode, der die Antwortdaten liefert, lautet wie folgt:
import os
def main(args):
# python dictionary
result_body = { "key_1" : "myfolder\myFile" }
return {
"headers": {
"Content-Type": "application/json",
"key" : "sample",
},
"statusCode": 200,
"body": result_body,
}
Der " curl-Mandant, der die Antwort " statusCcode, die " header-Felder und die Antwortdaten verwendet, sieht folgendermaßen aus:
curl -v -i https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud/
-> Response:
stdout>
* Host default-encoded-response.1lpigeajq5fg.us-east.codeengine.appdomain.cloud:443 was resolved.
* IPv6: 2606:4700:90:0:7554:9304:2cbe:8cbf
* IPv4: 172.65.197.223
* using HTTP/1.x
> GET / HTTP/1.1
> Host: default-encoded-response.1lpigeajq5fg.us-east.codeengine.appdomain.cloud
> User-Agent: curl/8.8.0
> Accept: *//*
* Request completely sent off
< HTTP/1.1 200 OK
< content-type: application/json
< key: sample
< x-faas-actionstatus: 200
< x-faas-activation-id: 5cbab12c-5c6e-4000-96cf-0f7fcb42a979
< x-request-id: e7098271-4780-4893-bbd4-64d4c8d7605e
< content-length: 13
{ "key_1" : "myfolder\\myFile }* Connection
beispiele für Funktionsaufrufe: Code Engine
Folgen Sie diesen Schritten, um die Erstellung einer Code Engine Funktion mit der CLI und die Verwendung der externen Datenschnittstelle zu sehen:
-
Speichern Sie den folgenden Code als
hello.jslokal:function main(args) { return { headers: { content_type: "application/json" }, statusCode: 200, body: {args: args} }; } -
Nachdem Sie sich bei IBM Cloud® angemeldet und den Funktionsdienst Code Engine ausgewählt haben, erstellen Sie eine neue Funktion:
ibmcloud ce fn create --name sample --runtime nodejs --inline-code sample.js --cpu 0.5 --memory 2GBeispielausgabe:
Creating function 'sample'... OK Run 'ibmcloud ce function get -n sample' to see more details. ibmcloud ce function get -n sample Getting function 'sample'... OK Name: sample ... Status: Ready URL: https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud ... -
Verwenden Sie die externe Datenschnittstelle mit einem '
curl-Kommando, um die Funktion aufzurufen:curl -v https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud/Beispielausgabe:
{ "args": { "__ce_headers": { "Accept": "*/*", "User-Agent": "curl/7.58.0", "X-Request-Id": "813804ec-ef14-42e9-bce3-c162373defae" }, "__ce_method": "GET", "__ce_path": "/" } } -
Rufen Sie die Funktion mit Hilfe von Abfrageparametern auf:
curl -v "https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud/?planet1=Mars&planet2=Jupiter"Beispielausgabe:
{ "args": { "__ce_headers": { "Accept": "*/*", "User-Agent": "curl/7.58.0", "X-Request-Id": "d03a1af0-bfc8-4a50-be7d-a72040c02cc9" }, "__ce_method": "GET", "__ce_path": "/", "__ce_query": "planet1=Mars&planet2=Jupiter", "planet1": "Mars", "planet2": "Jupiter" } }Der Abfrageparameter steht ungefaltet in den Argumenten und auch unmodifiziert in "
__ce_queryzur Verfügung. -
Rufen Sie die Funktion mit Hilfe von Formulardaten auf:
curl -H "Content-Type: application/x-www-form-urlencoded" -d 'planet1=Mars&planet2=Jupiter' https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloudBeispielausgabe:
{ "args": { "__ce_body": "planet1=Mars&planet2=Jupiter", "__ce_headers": { "Accept": "*/*", "Content-Length": "28", "Content-Type": "application/x-www-form-urlencoded", "User-Agent": "curl/7.58.0", "X-Request-Id": "eb3e2179-c396-4eee-98cb-809316f0a765" }, "__ce_method": "POST", "__ce_path": "/" } }Der Inhalt des Anforderungskörpers steht unverändert im Argument "
__ce_bodyzur Verfügung, wobei Zeichen, die in JSON reserviert sind, escaped werden. -
Rufen Sie die Funktion mit Hilfe eines JSON-Datenobjekts auf:
curl -H "Content-Type: application/json" -d '{"planet1": "Mars", "planet2": "Jupiter"}' https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloudBeispielausgabe:
{ "args": { "__ce_body": "eyJwbGFuZXQxIjogIk1hcnMiLCAicGxhbmV0MiI6ICJKdXBpdGVyIn0=", "__ce_headers": { "Accept": "*/*", "Content-Length": "41", "Content-Type": "application/json", "User-Agent": "curl/7.58.0", "X-Request-Id": "c06ffcc3-fdae-4430-b881-01d68876c54c" }, "__ce_method": "POST", "__ce_path": "/", "planet1": "Mars", "planet2": "Jupiter" } }Der Inhalt des Anforderungskörpers steht in den Funktionsargumenten (
args) entfaltet zur Verfügung, wobei reservierte JSON-Zeichen in "__ce_body" als Base64-encoded Zeichenkette entschlüsselt und ebenfalls nicht verändert werden. -
Rufen Sie die Funktion mit Hilfe von JSON-Daten und Abfrageparametern auf:
curl -H "Content-Type: application/json" -d '{"planet1": "Mars", "planet2": "Jupiter"}' "https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud?planet2=Venus&planet3=Uranus"Beispielausgabe:
{ "args": { "__ce_body": "eyJwbGFuZXQxIjogIk1hcnMiLCAicGxhbmV0MiI6ICJKdXBpdGVyIn0=", "__ce_headers": { "Accept": "*/*", "Content-Length": "41", "Content-Type": "application/json", "User-Agent": "curl/7.58.0", "X-Request-Id": "daff83a5-fe53-43ef-8dc4-606e42dd8306" }, "__ce_method": "POST", "__ce_path": "/", "planet1": "Mars", "planet2": "Jupiter", "planet3": "Uranus" } }Die Body-Parameter und die Query-Parameter werden in die Funktionsargumente (
args) aufgefaltet. Body-Parameter überschreiben die Query-Parameter. Der Text der Anfrage ist in "__ce_body(Base64-encoded) verfügbar. Die Abfrageparameter sind in "__ce_queryverfügbar. -
Rufen Sie die Funktion mit dem Inhaltstyp Text auf:
curl -H "Content-Type: text/plain" -d 'Here we have some text. The JSON special characters like \ or " are escaped.' https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloudBeispielausgabe:
{ "args": { "__ce_body": "Here we have some text. The JSON special characters like \\ or \ are escaped.", "__ce_headers": { "Accept": "*/*", "Content-Length": "76", "Content-Type": "text/plain", "User-Agent": "curl/7.58.0", "X-Request-Id": "43d259eb-4247-41a9-894a-1dbd98eb16fb" }, "__ce_method": "POST", "__ce_path": "/" } }Der Inhalt des Anfragekörpers steht unverändert in "
__ce_bodyzur Verfügung, aber mit JSON-Sonderzeichen, die mit "\\oder "\" escaped werden. -
Rufen Sie die Funktion mit dem binären Inhaltstyp auf:
curl -H "Content-Type: application/octet-stream" -d 'This string is treaded as binary data.' https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloudBeispielausgabe:
{ "args": { "__ce_body": "VGhpcyBzdHJpbmcgaXMgdHJlYWRlZCBhcyBiaW5hcnkgZGF0YS4=", "__ce_headers": { "Accept": "*/*", "Content-Length": "38", "Content-Type": "application/octet-stream", "User-Agent": "curl/7.58.0", "X-Request-Id": "a90826e0-db13-4b8a-809f-60cea2a27d96" }, "__ce_method": "POST", "__ce_path": "/" } }