IBM Cloud Docs
Datenaustausch mit Funktionen

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.

Funktionsschnittstellen.
Informationsfluss für Code Engine Funktionen

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:

Parameter für die Eingangsargumente einer Code Engine Funktion
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:

args-Parameter aus Abfrageparametern beim Aufruf von Funktionen
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:

args-Parameter aus Kopfparametern beim Aufruf von Funktionen
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).

args-Parameter aus Abfrageparametern beim Aufruf von Funktionen
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:

args-Parameter aus den Anfragedaten
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:

args-Parameter aus den Anfragedaten
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:

args-Parameter aus den Anfragedaten
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:

Struktur des Ergebnisobjekts in einem JSON-Objekt (SpracheNode.js ) oder einem Wörterbuch (SprachePython )
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:

Körperfeld Ergebnisstruktur
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:

Schlüssel-Wert-Paare in Code Engine
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:

  1. Speichern Sie den folgenden Code als hello.js lokal:

    function main(args) {
      return { headers: { content_type: "application/json" },
        statusCode: 200,
        body: {args: args}
      };
    }
    
  2. 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 2G
    

    Beispielausgabe:

    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
    ...
    
  3. 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": "/"
        }
    }
    
  4. 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_query zur Verfügung.

  5. 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.cloud
    

    Beispielausgabe:

    {
        "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_body zur Verfügung, wobei Zeichen, die in JSON reserviert sind, escaped werden.

  6. 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.cloud
    

    Beispielausgabe:

    {
        "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.

  7. 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_query verfügbar.

  8. 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.cloud
    

    Beispielausgabe:

    {
        "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_body zur Verfügung, aber mit JSON-Sonderzeichen, die mit " \\ oder " \" escaped werden.

  9. 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.cloud
    

    Beispielausgabe:

    {
        "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": "/"
        }
    }