Echange de données avec des fonctions

L'appel d'un service de fonctions d' Code Engine s (ou simplement d'une fonction) s'effectue côté client par le biais de requêtes d' HTTP. Les informations peuvent être transmises à la fonction de la manière suivante :

  • Dans le cadre de l' URL (chemin et éventuellement, paramètres de requête)
  • Par le biais des en-têtes de requête HTTP
  • Par l'intermédiaire de l'organisme de demande d' HTTP

Un appelant reçoit ces valeurs côté client sous la forme d'une réponse d' HTTP. Les données de réponse sont transmises comme suit :

  • Comme HTTP code de réponse
  • Par le biais des en-têtes de réponse HTTP
  • Par l'intermédiaire de l'organisme de réponse aux incidents ( HTTP )

Toutes les règles et capacités permettant d'invoquer une fonction par le biais de requêtes d' HTTP s et les réponses d' HTTP s qui en résultent constituent l'interface de données externe.

Une demande d' HTTP s entrante est transmise au code de fonction pour traitement en utilisant les règles de l'interface de données de demande interne. Les résultats fournis par le code de la fonction doivent respecter les règles de l'interface interne des données de réponse.

Le diagramme suivant montre le flux d'informations d'un client qui utilise l'interface de données externes. Le processus utilise le service de fonctions Code Engine et l'interface de données de demande interne au code de la fonction. De même, les données résultantes passent du code de la fonction à l'interface de données de réponse interne via le service de fonctions Code Engine, et l'interface de données externe retourne à l'appelant.

Interfaces

Functions.
Flux d'informations pour les fonctions Code Engine

Interface de données de requête externe

La définition de l'interface de données externe est dérivée de l' HTTP, qui est normalisée.

Mime Types (types MIME)

Les types MIME sont utilisés pour définir le format des informations de la requête HTTP et de la réponse HTTP.

Les types IANA MIME suivants sont pris en charge pour le type de contenu (Content-Type) des requêtes HTTP ou des réponses HTTP. Les paramètres de type MIME sont pris en charge, mais ne figurent pas dans cette liste :

  • Type JSON :
    • application/json; <parameters>
  • Types binaires:
    • audio/*; <parameters>
    • application/octet-stream; <parameters>
    • example/*; <parameters>
    • font/*; <parameters>
    • image/*; <parameters>
    • model/*; <parameters>
    • multipart/*; <parameters>
    • video/*; <parameters>
  • Types de texte:
    • text/plain; <parameters>
    • text/html; <parameters>
    • text/*; <parameters>
  • Type codé en pourcentage :
    • application/x-www-form-urlencoded; <parameters>

Données de demande

Lorsqu'une fonction est appelée, elle peut recevoir des données arbitraires (charge de la demande) au format texte ou binaire. La présence d'une valeur d' Content-Type dans l'en-tête de la requête d' HTTP détermine la forme et l'encodage des données qui sont envoyées à la fonction. La structure des données, le format et le type de contenu doivent correspondre. Le service des fonctions d' Code Engine s effectue une vérification minimale de validation des données en tenant compte du type de contenu et répond avec le code d'état HTTP 400 dans certains cas; par exemple, si le format ou l'encodage des données JSON n'est pas valide.

Pour toutes les autres valeurs " Content-Type sélectionnées, il est prévu que le format des données corresponde aux restrictions du type MIME.

Fournir les données de la requête en tant que paramètres de la requête

Les données demandées peuvent être fournies sous forme de paires clé-valeur au format encodé en base URL (également appelé encodage en pourcentage) dans le fichier HTTP URL.

Le codage en pourcentage est largement utilisé dans la technologie Web. Tous les caractères 8 bits sont écrits sous forme de valeurs hexadécimales précédées d'un signe de pourcentage (%). Ce type de codage est également appelé codage ASCII ( URL ).

Exemple d'invocation d'une fonction à l'aide de paramètres de requête :

curl -v "https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud/?planet1=Mars&planet2=Jupiter"

Fournir les données de la demande dans le corps de la demande

Les données demandées sont fournies dans le corps de la requête HTTP. Le format des données doit correspondre à la valeur " Content-Type fournie.

Exemples d'invocation d'une fonction en utilisant les données du corps sous 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

Exemple d'invocation d'une fonction en utilisant les données du corps dans Windows™ :

curl -v  -H "Content-Type: application/json" -d "{\"key_1\":\"Mars\",\"planet2\":\"Jupiter\"}"  "https://function-nodejs-95.1057yuwab63w.us-east.codeengine.appdomain.cloud"

Si la valeur Content-Type est manquante pour une demande, Code Engine traite les données utiles de la manière décrite pour application/json.

Fournir les données d'en-tête de la demande

Les données demandées sont fournies sous forme de paires clé-valeur dans l'en-tête de la requête HTTP.

Exemple d'invocation d'une fonction à l'aide de champs d'en-tête :

curl -v -H "Sample_Data: Sample_Value"  https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud

Fournir des données mixtes à la demande

Code Engine les fonctions prennent en charge l'utilisation de différentes manières de fournir des données de demande dans une seule demande d' HTTP.

Exemple d'invocation d'une fonction en utilisant les données du corps et les champs d'en-tête :

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

Exemple d'invocation d'une fonction en utilisant les données du corps, les en-têtes et les paramètres de la requête :

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

Interface de données de requête interne

L'interface de données de demande interne décrit comment le service de fonctions Code Engine fournit au code de la fonction les données de demande reçues sur l'interface de données externe. Indépendamment du langage de codage, vous pouvez mettre en œuvre une logique de fonction pour placer tous les paramètres de la requête dans la fonction main() en tant que premier paramètre.

Vous pouvez utiliser n'importe quel nom pour ce paramètre ; dans les exemples suivants, le paramètre est appelé " args.

En outre, le code de la fonction reçoit un ensemble de variables d'environnement prédéfinies injectées automatiquement.

Exemple Python :

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 exemple :

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;

Le service de fonctions Code Engine utilise différents encodages pour les données d'entrée afin de garantir que le code de la fonction puisse accéder aux données d'entrée dans l'argument " args. Les codages permettent de s'assurer que les données structurées, le texte simple, les données et les données binaires peuvent faire partie des données d'entrée.

Encodage du texte

Le codage texte est utilisé pour les éléments du paramètre d'entrée " args qui contiennent une charge utile textuelle. Le codage est nécessaire pour garantir que les caractères spéciaux sont échappés et n'endommagent pas la structure de données du paramètre " args.

Code Engine exécute l'encodage du contenu du texte avant d'appeler la fonction main(). La logique du programme de la fonction peut avoir besoin de les désencapsuler pour recréer les données d'origine.

Caractères d'échappement pris en charge:

  • Le retour arrière est remplacé par \b.
  • L'alimentation papier est remplacée par \f.
  • Le retour à la ligne est remplacé par \n.
  • Le retour chariot est remplacé par \r.
  • L'onglet est remplacé par \t.
  • Les guillemets sont remplacés par \".
  • La barre oblique inverse est remplacée par \\.

Codage Base64

Le codage Base64 est utilisé pour les éléments du paramètre d'entrée " args qui peuvent rompre la structure de données interne du paramètre " args. L'encodage en Base64 permet de s'assurer que la valeur entière est constituée uniquement de caractères lisibles dans un alphabet de 64 caractères.

Exemple :

"eyAicGxhbmV0MSI6Ik1hcnMiLCAicGxhbmV0MiI6Ikp1cGl0ZXIiIH0="

Codage en pourcentage (codage « URL »)

Le codage en pourcentage est largement utilisé dans la technologie Web. Tous les caractères 8 bits sont écrits sous forme de valeur hexadécimale précédée d'un signe de pourcentage (%). Ce type de codage est également connu sous le nom de codage ASCII ( URL ). La fonction reçoit les données de type " form-urlencoded en format brut dans le paramètre " __ce_body

Le service de fonctions Code Engine transmet les paramètres de la requête tels quels (le premier " ? n'en fait pas partie) dans le champ " __ce_query du paramètre " args. Ainsi, le code de fonction reçoit ce paramètre au format encodé en URL, par exemple :

"x%5cb=1%22f4%20and%20"

Le paramètre " args

Le paramètre " args est une structure de données spécifique au langage (objet JSON pour Node.js et type " dict " (dictionnaire) pour Python) remplie avec les données d'entrée de la demande dans le format suivant :

Éléments de premier niveau Description
__ce_<service_variable> Code Engine argument d'entrée interne du service.
__ce_headers Une copie de l'élément d'en-tête de la requête « HTTP ».
<property> (facultatif) Propriétés de haut niveau disponibles si les données d'entrée de la requête d' HTTP s sont fournies dans un format structuré (uniquement si un type de contenu application/json est utilisé).
{ : caption="Éléments pour le paramètre '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"
      }
  }

paramètre args défini pour les arguments d'entrée internes (__ce_*)

Le service de fonctions Code Engine injecte des arguments d'entrée réservés dans les données d'entrée " args

Les paramètres suivants peuvent apparaître dans l'argument " args en fonction de la manière dont l'appelant fournit les données de la demande :

Paramètres des arguments d'entrée d'une fonction Code Engine
Nom du paramètre Type de valeur Description
__ce_method Chaîne La méthode de requête « HTTP » (soit une requête GET, soit une requête POST).
__ce_headers Carte de paires clé-valeur Paires clé-valeur de l'en-tête de requête d' HTTP.
__ce_path Chaîne URL chemin de la requête d' HTTP.
__ce_body Chaîne L'entité de corps de demande, sous la forme d'une chaîne Base64-encoded lorsque le type de contenu de la demande est binaire, ou sous la forme d'une chaîne en clair, dans le cas contraire.
__ce_query Chaîne Les paramètres de requête provenant de la demande en tant que chaîne non analysée. Le paramètre __ce_query est une chaîne unique qui contient les paramètres de requête analysés à partir de l' URL, sans le point d'interrogation (?), et séparés par une esperluette (&).

Les paramètres d' __ce_* s internes ne peuvent pas être écrasés par les données de requête fournies dans la requête d' HTTP. HTTP les appels qui tentent d'écraser échouent avec le code d'état « 400 » (mauvaise requête).

Contenu du paramètre " args si l'appelant fournit les données de la demande au moyen de paramètres de requête

Une fonction reçoit des données de paramètres de requête sous forme de paires clé-valeur dans le paramètre " __ce_query ", et est encodée en pourcentage (encodage " URL "). En outre, chaque paramètre de la requête est une paire clé-valeur dans le format décodé :

paramètre args des paramètres de la requête lors de l'invocation de fonctions
argsZone Est-ce que c'est réglé ? Description
__ce_body Non Corps
__ce_headers Oui En-tête sans type de contenu
__ce_query Oui Paramètre de requête (codé en URL )
Propriété de premier niveau Oui Paire clé-valeur ( URL-décodé et texte-encodé)

Exemple Python d'accès aux paramètres de requête :

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,
  }

Exemple Node.js d'accès aux paramètres de requête :

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;

Contenu du paramètre " args si l'appelant fournit les données de la demande par des données d'en-tête

Une fonction reçoit les données d'en-tête de la demande sous forme de paires clé-valeur dans le paramètre " __ce_headers. La paire clé-valeur est convertie dans un format canonique, quel que soit le format dans lequel la clé est définie sur l'interface de données externe. Par exemple, les deux mykey ou MYKEY sont convertis en Mykey:

paramètre args des paramètres d'en-tête lors de l'invocation de fonctions
argsZone Est-ce que c'est réglé ? Description
__ce_body Non Corps
__ce_headers Oui En-tête en paire clé-valeur (codée en texte) (la clé est au format canonique).
__ce_query "" Le paramètre de la requête est une chaîne vide.
Propriété de premier niveau Non

Exemple Python d'accès aux données d'en-tête :

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,
  }

Exemple Node.js d'accès aux données d'en-tête :

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;

paramètre args des données de la demande du type de contenu " application/json

Une fonction reçoit les clés et les valeurs du document JSON en tant que paramètres de propriété de premier niveau dédiés.

Lorsque la valeur Content-type n'est pas définie dans la requête HTTP, la fonction Code Engine utilise la valeur application/json par défaut.

En outre, la charge utile JSON est mise à la disposition de la fonction telle quelle (sous la forme d'un tableau d'octets) au format Base64-encoded dans le paramètre " __ce_body.

paramètre args des paramètres de la requête lors de l'invocation de fonctions
argsZone Est-ce que c'est réglé ? Description
__ce_body Oui Données de la demandeBase64-encoded
__ce_headers Oui Le type de contenu est défini
__ce_query "" Chaîne vide
Propriété de premier niveau Oui Paire clé-valeur pour chaque élément de premier niveau (codé en texte)

Exemple Python d'accès aux données d'entrée " 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,
  }

Exemple Node.js d'accès aux données d'entrée " 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;

paramètre args des données de la demande du type de contenu " application/octet-stream

Une fonction reçoit des données binaires au format Base64-encoded pour les données binaires " __ce_body dans le paramètre " __ce_body:

paramètre args des données de la demande
argsZone Est-ce que c'est réglé ? Description
__ce_body Oui Données de la demandeBase64-encoded
__ce_headers Oui Le type de contenu est défini
__ce_query "" Chaîne vide
Propriété de premier niveau Non

Exemple Python d'accès aux données d'entrée " 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,
  }

Exemple Node.js d'accès aux données d'entrée " 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;

paramètre args des données de la demande du type de contenu " text/plain

Une fonction reçoit des données de type texte au format Base64-encoded dans le paramètre " __ce_body:

paramètre args des données de la demande
argsZone Est-ce que c'est réglé ? Description
__ce_body Oui Données de la demande (codées en texte)
__ce_headers Oui Le type de contenu est défini
__ce_query "" Chaîne vide
Propriété de premier niveau Non

La logique du programme de la fonction peut avoir besoin de les désencapsuler pour recréer les données d'origine.

Exemple Python d'accès aux données d'entrée " 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,
  }

Exemple Node.js d'accès aux données d'entrée " 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;

paramètre args des données de la demande du type de contenu " application/x-www-form-urlencoded

Une fonction reçoit les données complètes du corps en format texte dans le paramètre " __ce_body:

paramètre args des données de la demande
argsZone Est-ce que c'est réglé ? Description
__ce_body Oui Données de la demande (codées en texte)
__ce_headers Oui Le type de contenu est défini
__ce_query "" Chaîne vide
Propriété de premier niveau Non

Exemple Python d'accès aux données d'entrée " 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,
  }

Exemple Node.js d'accès aux données d'entrée " 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;

paramètre args à partir des données de la demande de type de contenu " application/x-www-form-urlencoded et des paramètres de la requête

Toutes les combinaisons de types de données mixtes sont possibles, mais il faut tenir compte du fait que pour les requêtes d' HTTP, avec des paramètres de requête ( URL ) et des paramètres de corps (body parameters), les paramètres de corps ont priorité sur les paramètres de requête.

Variables d'environnement de la fonction Code Engine

Alors que les paramètres d'appel de fonction sont dérivés de la requête d' HTTP, une fonction d' Code Engine a également accès à un ensemble de variables d'environnement prédéfinies dérivées des paramètres système :

  • CE_ALLOW_CONCURRENT
  • CE_API_BASE_URL
  • CE_DOMAIN
  • CE_EXECUTION_ENV
  • CE_FUNCTION
  • CE_PROJECT_ID
  • CE_REGION
  • CE_SUBDOMAIN

Pour plus d'informations sur ces variables d'environnement, voir Variables d'environnement injectées automatiquement.

Exemple Python d'accès aux variables d'environnement :

import os

def main(args):
  curEnv=dict(os.environ)
  return {
    "headers": { "Content-Type": "application/json" },
    "statusCode": 200,
    "body": {
      "env": curEnv,
    }
  }

Exemple Node.js d'accès aux variables d'environnement :

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;

Interface de données de réponse interne

L'interface interne des données de réponse décrit la manière dont le code de fonction fournit les données de réponse. Le service des fonctions d' Code Engine s traite les données et fournit une réponse d' HTTP s à l'appelant.

Indépendamment du langage de programmation, le code de la fonction doit fournir les données de réponse sous forme de structure de données dans l'instruction de retour.

En fonction du langage de programmation, l'objet résultat est soit un objet JSON (langageNode.js ), soit un dictionnaire (langagePython ) avec la structure suivante :

Structure de l'objet résultat dans un objet JSON (langageNode.js ) ou un dictionnaire (langagePython
Fonctions données de résultat Condition requise Description
headers Facultatif Objet résultat dont les clés sont des noms d'en-têtes et les valeurs des chaînes, des nombres ou des valeurs booléennes. Pour envoyer plusieurs valeurs pour un seul en-tête, la valeur de l'en-tête est un tableau des valeurs multiples. Aucun en-tête n'est défini par défaut.
statusCode Devrait (par défaut 200) Code de statut HTTP valide.
body Facultatif (par défaut : vide) Une chaîne qui est soit du texte brut, soit un objet ou un tableau JSON, soit une chaîne Base64-encoded pour les données binaires. Le corps est considéré comme vide s'il est nul, s'il s'agit d'une chaîne vide ("") ou s'il est indéfini.

Exemple de structure de données de résultat pour fournir les données de résultat de l'exécution de la fonction :

import os
def main(args):
  return {
    headers: {
      "content_type" : "application/json" ,
      "key" , "value"
    },
    "statusCode": 200,
    body: {"myMessage" : "sample message"}
  }

Définissez toujours 'body et 'statusCode. La définition implicite de statusCode et de body n'est disponible que pour des raisons de compatibilité avec les fonctions obsolètes de Code Engine.

Élément headers

L'objectif principal de la section des en-têtes est de définir le type de contenu dans lequel la fonction va fournir les données de la réponse. Les données de résultat prennent en charge la valeur " MIME-Type identique à celle acceptée sur demande.

En fonction de la valeur " Content-Type, le champ "body" de la structure de résultat doit contenir les éléments suivants :

Structure du résultat du champ du corps
Type de contenu Valeur attribuée à l'élément body Exemple
application/json Objet JSON body : { key_1: val1 }
Non défini (par défaut) Chaîne body : "some text"
text/* Chaîne body : "some text"
audio/*, example/*, font/', image/*, video/*, et tous les types restants Base64-encoded body: "SGVsbG8gV29ybGQhCg=="

De même, le code de fonction peut utiliser des paires clé-valeur dans l'en-tête de réponse de l' HTTP, afin de fournir des données de réponse. Par conséquent, le code doit placer un nom de clé unique et sa valeur dans la section des en-têtes de la structure de données utilisée dans l'instruction de retour.

Prenez note de ces considérations clés sur les noms :

  • Les noms de clés sont insensibles à la casse
  • L'attribution de valeur la plus récente pour des noms de clés identiques est utilisée
  • Les barres obliques inversées ou les blancs ne sont pas pris en charge

Prenez note de ces considérations de valeur :

  • Les valeurs doivent être codées en texte
  • Les valeurs doivent être de type chaîne de caractères ou tableau de chaînes de caractères

Exemple de renvoi de données de réponse sous la forme d'une paire clé-valeur d'en-tête :

import os
def main(args):

  return {
    "headers": {
      "Content-Type": "text/plain",
      "key_1" : "sample_value",
    },
    "statusCode": 200,
    "body": "" ,
  }

Élément statusCode

Le code des fonctions doit explicitement définir un code d'état (par défaut " 200) pour informer l'appelant du résultat de l'exécution. Vous pouvez utiliser n'importe quel code de statut de retour valide d' HTTP, c'est-à-dire les codes de statut allant de 200 à 599.

Le service des fonctions d' Code Engine s renvoie le code d'état de la fonction dans le champ d'en-tête (x-faas-actionstatus) et sous la forme d'un code d'état d' HTTP.

Si l' statusCode n'est pas valide, le service Code Engine functions renvoie le code de retour HTTP 422 (Invalid function code cannot be processed) sans le champ d'en-tête x-faas-actionstatus et sans données de réponse supplémentaires.

Si la limite de taille de résultat pour les fonctions est atteinte, un code d'état d' HTTP s « 400 » est renvoyé au client.

Exemple de retour d'un code d'état de réponse :

import os
  def main(args):

  return {
    "statusCode": 200,
    "body": "" ,
  }

Élément body

Le code de la fonction peut inclure la section " body de la structure de données de retour pour fournir les données de réponse de la fonction. Le code de la fonction est chargé de fournir l'élément " body de la structure de données de retour au format correspondant au " Content-Type. Si la réponse de la fonction " Content-Type est manquante, le code de la fonction renvoie " Content-Type: text/plain; charset=utf-8 à l'interface externe et les données du champ " body sous leur forme inchangée.

Considérez les règles suivantes, en fonction du type de contenu utilisé.

Valeur du corps du type de contenu " application/json

Le code de la fonction doit fournir la valeur de l'élément " body sous la forme d'une structure de données valideNodeJs-JSON ou Python). Les clés et les valeurs de la structure de données doivent respecter les règles de syntaxe JSON afin que le service Code Engine puisse fournir les données de réponse dans la section de données de réponse application/json HTTP.

Les barres obliques inversées (\) et les guillemets doubles (") de la structure de données sont fournis sous forme de texte codé dans la section des données de réponse HTTP.

Exemple Python d'une réponse " 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,
    }

Exemple Node.js d'une réponse " 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;

Valeur du corps du type de contenu " application/octet-stream

Les données de résultat du code de fonction doivent être Base64-encoded avant d'être ajoutées à la structure de résultat.

Exemple Python d'une réponse " 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,
  }

Exemple Node.js d'une réponse " 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;

Valeur du corps du type de contenu " text/plain

Le code de la fonction doit fournir l'ensemble de la réponse en une seule chaîne. Le service de fonctions Code Engine ne vérifie pas les données de réponse ; les données sont transférées à l'appelant comme prévu.

Exemple Python d'une réponse " text/plain

def main(args):
  result_body = "myfolder_myFile"

  return {
    "headers": {
      "Content-Type": "text/plain;charset=utf-8",
    },
    "statusCode": 200,
    "body": result_body,
  }

Valeur du corps du type de contenu " application/x-www-form-urlencoded (contenu codé en pourcentage)

URL Le code de fonction doit permettre de s'assurer que les données de réponse sont encodées en UTF-8 avant d'être ajoutées à la structure de données de résultat. Le service des fonctions d' Code Engine s ne vérifie pas la syntaxe des données de réponse. Les données sont transférées à l'appelant comme prévu.

Exemple Python d'une réponse " 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,
  }

Interface de données de réponse externe

La définition de l'interface de données externe est dérivée de l' HTTP, qui est normalisée. Les types MIME dans l'en-tête de réponse HTTP sont utilisés pour définir le format de la réponse HTTP.

Mime Types (types MIME)

Lorsque Code Engine renvoie des données au monde extérieur, les fonctions Code Engine peuvent prendre en charge les mêmes types MIME de l'IANA que ceux décrits dans les types MIME.

Données de réponse

L'interface de données externe renvoie la structure de données de réponse sous la forme d'un en-tête d' HTTP, d'un code d'état d' HTTP, et de données de réponse d' HTTP à l'appelant de la fonction.

zones d'en-tête HTTP

L'en-tête d' HTTP s contient toutes les paires clé-valeur que le code de fonction a ajoutées à la structure de données de résultat.

Le service de fonctions Code Engine ajoute les paires clé-valeur suivantes :

Paires clé-valeur dans les fonctions Code Engine
Nom de zone Description
x-request-id L'identifiant de la demande externe pour la fonction invoquée.
x-faas-activation-id L'ID interne du service des fonctions Code Engine pour l'invocation.
x-faas-actionstatus Le code d'état le code de fonction défini.

Les noms des clés d'en-tête sont toujours indiqués en minuscules.

Codes de statut HTTP

L'origine du code d'état d' HTTP peut être le service des fonctions d' Code Engine lui-même ou le code d'état défini par le code de fonction. La présence du champ d'en-tête " x-faas-statuscode est l'indicateur de l'origine.

La signification du code d'état d' HTTP peut être lue dans la documentation des fonctions d' Code Engine, si le champ d'en-tête d' x-faas-actionstatus n'est pas défini. Cependant, si le champ d'en-tête est défini, la logique de la fonction définit la signification du code d'état d' HTTP.

Code Engine exécute un contrôle de validité limité sur les données de la réponse et le type de contenu, et renvoie un code d'état HTTP ( 400 ) si le format ou le codage des données (généré par le code de fonction) n'est pas valide.

HTTP données de réponse

Les données de réponse d' HTTP s sur l'interface de données externe sont identiques à celles fournies dans la structure de données de résultat par le code de fonction. Ce n'est que si le " MIME-Type est le " application/json que la clé et les valeurs de la réponse JSON fournie sont modifiées. Toutes les barres obliques inverses et tous les guillemets doubles sont échappés.

Par exemple, l'appelant obtient des données de réponse de type " application/json Le code de fonction qui fournit les données de réponse est le suivant :

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,
  }

Le client " curl qui utilise la réponse " statusCcode, les champs " header et les données de la réponse est le suivant :

  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

exemples d'invocation de fonctions Code Engine

Suivez ces étapes pour voir la création d'une fonction Code Engine avec l'interface de programmation et l'utilisation de l'interface de données externes :

  1. Enregistrez localement le code suivant sous hello.js:

    function main(args) {
      return { headers: { content_type: "application/json" },
        statusCode: 200,
        body: {args: args}
      };
    }
    
  2. Après vous être connecté à IBM Cloud® et avoir sélectionné le service de fonctions Code Engine, créez une nouvelle fonction :

    ibmcloud ce fn create --name sample --runtime nodejs --inline-code sample.js --cpu 0.5 --memory 2G
    

    Exemple de sortie :

    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. Utilisez l'interface de données externe avec une commande 'curl pour appeler la fonction :

    curl -v https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud/
    

    Exemple de sortie :

    {
        "args": {
            "__ce_headers": {
            "Accept": "*/*",
            "User-Agent": "curl/7.58.0",
            "X-Request-Id": "813804ec-ef14-42e9-bce3-c162373defae"
            },
            "__ce_method": "GET",
            "__ce_path": "/"
        }
    }
    
  4. Invoquer la fonction en utilisant les paramètres de la requête :

    curl -v "https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud/?planet1=Mars&planet2=Jupiter"
    

    Exemple de sortie :

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

    Le paramètre de la requête est disponible tel quel dans les arguments et également sans modification dans le " __ce_query".

  5. Invoquer la fonction en utilisant les données du formulaire :

    curl -H "Content-Type: application/x-www-form-urlencoded" -d 'planet1=Mars&planet2=Jupiter' https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud
    

    Exemple de sortie :

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

    Le contenu du corps de la demande est disponible sans modification dans l'argument '__ce_body avec les caractères réservés JSON qui sont échappés.

  6. Invoquer la fonction en utilisant un objet de données JSON :

    curl -H "Content-Type: application/json" -d '{"planet1": "Mars", "planet2": "Jupiter"}' https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud
    

    Exemple de sortie :

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

    Le contenu du corps de la demande est disponible déplié dans les arguments de la fonction (args) avec les caractères réservés JSON qui sont échappés et également non modifiés en tant que chaîne Base64-encoded dans " __ce_body.

  7. Invoquer la fonction en utilisant les données JSON et les paramètres de la requête :

    curl -H "Content-Type: application/json" -d '{"planet1": "Mars", "planet2": "Jupiter"}' "https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud?planet2=Venus&planet3=Uranus"
    

    Exemple de sortie :

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

    Les paramètres du corps et les paramètres de la requête sont déployés dans les arguments de la fonction (args). Les paramètres du corps remplacent les paramètres de la requête. Le corps de la demande est disponible en '__ce_body (Base64-encoded. Les paramètres de la requête sont disponibles dans " __ce_query.

  8. Invoquer la fonction en utilisant le type de contenu texte :

    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
    

    Exemple de sortie :

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

    Le contenu du corps de la demande est disponible sans modification dans " __ce_body, mais avec les caractères spéciaux JSON échappés dans " \\ ou " \.

  9. Invoquer la fonction en utilisant le type de contenu binaire :

    curl -H "Content-Type: application/octet-stream" -d 'This string is treaded as binary data.' https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud
    

    Exemple de sortie :

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