Scambio di dati con funzioni

L'invocazione di un servizio di funzioni di tipo " Code Engine " (o semplicemente una funzione) viene eseguita sul lato client tramite richieste " HTTP ". Le informazioni possono essere passate alla funzione nei seguenti modi:

  • Come parte dell' URL
  • Attraverso le intestazioni delle richieste di HTTP
  • Attraverso l'ente di richiesta dell' HTTP

Un chiamante riceve questi valori sul lato client come risposta dell' HTTP. I dati di risposta passano come segue:

  • Come codice di risposta HTTP
  • Attraverso intestazioni di rispost HTTP
  • Attraverso l'ente di risposta all'emergenza ( HTTP )

Tutte le regole e le capacità di invocare una funzione attraverso richieste di tipo " HTTP " e le risposte " HTTP " che ne risultano costituiscono l'interfaccia dati esterna.

Una richiesta di HTTP e in arrivo viene inoltrata al codice funzione per l'elaborazione utilizzando le regole dell'interfaccia dati di richiesta interna. I risultati forniti dal codice funzione devono seguire le regole dell'interfaccia interna dei dati di risposta.

Il diagramma seguente mostra il flusso di informazioni di un client che utilizza l'interfaccia dati esterna. Il processo utilizza il servizio di funzioni Code Engine e l'interfaccia interna dei dati della richiesta al codice della funzione. Allo stesso modo, i dati risultanti passano dal codice della funzione all'interfaccia interna dei dati di risposta attraverso il servizio di funzioni Code Engine e l'interfaccia dei dati esterni torna al chiamante.

Interfacce di funzioni.
Flusso di informazioni per le funzioni di Code Engine

Interfaccia dati di richiesta esterna

La definizione dell'interfaccia dati esterna deriva dallo standard HTTP.

Tipi MIME

I tipi MIME sono utilizzati per definire il formato delle informazioni della richiesta HTTP e della risposta HTTP.

I seguenti tipi IANA MIME sono supportati per il content-type (Content-Type) delle richieste HTTP o delle risposte HTTP. I parametri di tipo MIME sono supportati, ma non sono inclusi in questo elenco:

  • Tipo JSON:
    • application/json; <parameters>
  • Tipi binari:
    • audio/*; <parameters>
    • application/octet-stream; <parameters>
    • example/*; <parameters>
    • font/*; <parameters>
    • image/*; <parameters>
    • model/*; <parameters>
    • multipart/*; <parameters>
    • video/*; <parameters>
  • Tipi di testo:
    • text/plain; <parameters>
    • text/html; <parameters>
    • text/*; <parameters>
  • Tipo codificato in percentuale:
    • application/x-www-form-urlencoded; <parameters>

Dati richiesta

Quando viene invocata una funzione, può ricevere dati arbitrari (richiesto payload) in formato testo o binario. La presenza di un valore " Content-Type " nell'intestazione della richiesta " HTTP " determina la forma e la codifica dei dati inviati alla funzione. La struttura dei dati, il formato e il tipo di contenuto devono corrispondere. Il servizio funzioni dell' Code Engine, in alcuni casi, esegue un controllo minimo di convalida dei dati considerando il tipo di contenuto e risponde con il codice di stato HTTP 400 ; ad esempio, se il formato o la codifica dei dati JSON non sono validi.

Per tutti gli altri valori " Content-Type selezionati, ci si aspetta che il formato dei dati corrisponda alle restrizioni del tipo MIME.

Fornire i dati della richiesta come parametri della query

I dati richiesti possono essere forniti come coppie chiave-valore in formato codificato con l' URL, detto anche percent-encoded, nel file HTTP URL.

La codifica percentuale è ampiamente utilizzata nella tecnologia web. Tutti i caratteri a 8 bit sono scritti come valori esadecimali preceduti da un segno di percentuale (%). Questo tipo di codifica è noto anche come codifica " URL ".

Esempio di richiamo di una funzione tramite parametri di query:

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

Fornire i dati della richiesta nel corpo della richiesta

I dati richiesti sono forniti nella sezione del corpo della richiesta HTTP. Il formato dei dati deve corrispondere al valore " Content-Type fornito.

Esempi di invocazione di una funzione utilizzando i dati del corpo su 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

Esempio di richiamo di una funzione utilizzando i dati del corpo 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"

Se per una richiesta manca il valore Content-Type, Code Engine gestisce il payload dei dati come descritto per application/json.

Fornitura dei dati di intestazione della richiesta

I dati richiesti sono forniti in coppie chiave-valore nella sezione di intestazione della richiesta HTTP.

Esempio di richiamo di una funzione utilizzando i campi di intestazione:

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

Richiesta di dati misti

Code Engine le funzioni supportano l'uso di diversi modi per fornire dati di richiesta all'interno di una singola richiesta di informazioni ( HTTP ).

Esempio di richiamo di una funzione utilizzando i dati del corpo e i campi dell'intestazione:

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

Esempio di invocazione di una funzione utilizzando i dati del corpo, le intestazioni e i parametri della query:

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

Interfaccia dati di richiesta interna

L'interfaccia interna dei dati di richiesta descrive il modo in cui il servizio funzioni Code Engine consegna al codice funzione i dati di richiesta ricevuti sull'interfaccia dati esterna. Indipendentemente dal linguaggio di codifica, è possibile implementare una logica di funzione per inserire tutti i parametri della richiesta nella funzione main() come primo parametro.

È possibile utilizzare qualsiasi nome per questo parametro; negli esempi che seguono, il parametro è chiamato 'args.

Inoltre, il codice della funzione riceve una serie di variabili d'ambiente predefinite iniettate automaticamente.

Python esempio:

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

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;

Il servizio di funzioni Code Engine utilizza diverse codifiche per i dati di input per garantire che il codice della funzione possa accedere ai dati di input nell'argomento 'args. Le codifiche aiutano a garantire che i dati strutturati, il testo semplice, i dati e i dati binari possano far parte dei dati di input.

Codifica del testo

La codifica del testo viene utilizzata per gli elementi del parametro di input 'args che contengono un payload di testo. La codifica è necessaria per garantire che i caratteri speciali vengano evasi e non danneggino la struttura dei dati del parametro 'args.

Code Engine esegue la codifica del contenuto del testo prima di chiamare la funzione main(). La logica del programma della funzione potrebbe aver bisogno di disincapsularli per ricreare i dati originali.

Caratteri di escape supportati:

  • Il backspace viene sostituito con \b.
  • L'avanzamento modulo viene sostituito con \f.
  • Newline viene sostituito con \n.
  • Il ritorno a capo viene sostituito con \r.
  • La scheda viene sostituita con \t.
  • Le virgolette doppie vengono sostituite con \".
  • Il backslash è sostituito da \\.

Codifica Base64

La codifica Base64 viene utilizzata per gli elementi del parametro di input 'args che possono interrompere la struttura interna dei dati del parametro 'args. La codifica come Base64 garantisce che l'intero valore sia composto solo da caratteri leggibili in un alfabeto di 64 caratteri.

Ad esempio:

"eyAicGxhbmV0MSI6Ik1hcnMiLCAicGxhbmV0MiI6Ikp1cGl0ZXIiIH0="

Codifica percentuale (codifica URL )

La codifica percentuale è ampiamente utilizzata nella tecnologia web. Tutti i caratteri a 8 bit sono scritti come valore esadecimale preceduto da un segno di percentuale (%). Questo tipo di codifica è noto anche come codifica " URL ". La funzione riceve i dati di tipo " form-urlencoded in formato grezzo nel parametro " __ce_body.

Il servizio di funzioni Code Engine passa i parametri della query così come sono (l'iniziale '? non ne fa parte) nel campo '__ce_query del parametro 'args. In questo modo, il codice funzione riceve questo parametro in formato codificato con l' URL; ad esempio:

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

Il parametro " args

Il parametro 'args è una struttura di dati specifica del linguaggio (oggetto JSON per Node.js e tipo 'dict (dizionario) per Python) riempita con i dati di input della richiesta nel seguente formato:

Elementi di primo livello Descrizione
__ce_<service_variable> Code Engine argomento di input interno al servizio.
__ce_headers Una copia dell'elemento di intestazione della richiesta di accesso ( HTTP ).
<property> (facoltativo) Proprietà di alto livello disponibili se i dati di input della richiesta dell' HTTP e sono forniti in formato strutturato (solo se si utilizza un tipo di contenuto application/json ).
{: caption="Elementi per il parametro '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"
      }
  }

parametro args impostato per gli argomenti di input interni (__ce_*)

Il servizio di funzioni Code Engine inietta argomenti di input riservati nei dati di input " args.

I seguenti parametri possono comparire nell'argomento 'args, a seconda di come il chiamante fornisce i dati della richiesta:

Parametri per gli argomenti di input di una funzione Code Engine
Nome del parametro Tipo di valore Descrizione
__ce_method Stringa Il metodo di richiesta " HTTP " (richiesta GET o POST).
__ce_headers Mappa di coppie chiave-valore Coppie chiave-valore dell'intestazione della richiesta HTTP.
__ce_path Stringa URL del percorso della richiesta di HTTP.
__ce_body Stringa L'entità del corpo della richiesta, come aBase64-encoded stringa quando il tipo di contenuto della richiesta è binario o come stringa semplice, altrimenti.
__ce_query Stringa I parametri di query dalla richiesta sotto forma di stringa non analizzata. Il parametro " __ce_query " è una singola stringa che contiene i parametri di query analizzati dall' URL, senza il punto interrogativo iniziale (?) e separati da una e commerciale (&).

I parametri interni dell' __ce_* e non possono essere sovrascritti con i dati della richiesta forniti nella richiesta dell' HTTP. HTTP chiamate che tentano di sovrascrivere i fallimenti con codice di stato 400 (richiesta errata).

Contenuto del parametro 'args se il chiamante fornisce i dati della richiesta tramite i parametri della query

Una funzione riceve i dati dei parametri di query come coppie chiave-valore nel parametro " __ce_query " ed è codificata in percentuale (codifica " URL "). Inoltre, ogni singolo parametro della query è una coppia chiave-valore nel formato decodificato:

parametro args dai parametri della query quando si invocano le funzioni
args campo E' pronto? Descrizione
__ce_body No Corpo
__ce_headers Sì Intestazione senza tipo di contenuto
__ce_query Sì Parametro di query (codificato in URL )
Proprietà di primo livello Sì Coppia chiave-valore ( URL-decodificato e testo-codificato)

Esempio Python di accesso ai parametri della query:

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

Esempio di accesso ai parametri della query in Node.js:

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;

Contenuto del parametro 'args se il chiamante fornisce i dati della richiesta tramite dati di intestazione

Una funzione riceve i dati dell'intestazione della richiesta come coppie chiave-valore nel parametro " __ce_headers. La coppia chiave-valore viene convertita in un formato canonico, indipendentemente dal formato in cui la chiave è impostata sull'interfaccia dati esterna. Ad esempio, sia mykey che MYKEY vengono convertiti in Mykey:

parametro args dai parametri dell'intestazione quando si invocano le funzioni
args campo E' pronto? Descrizione
__ce_body No Corpo
__ce_headers Sì Intestazione in coppia chiave-valore (codificata in testo) (la chiave è in formato canonico).
__ce_query "" Il parametro della query è una stringa vuota.
Proprietà di primo livello No

Esempio Python di accesso ai dati di intestazione:

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

Esempio di accesso ai dati di intestazione in Node.js:

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;

args dai dati della richiesta di tipo content-type application/json

Una funzione riceve le chiavi e i valori del documento JSON come parametri di proprietà di primo livello dedicati.

Quando nella richiesta " HTTP " non viene impostato alcun valore per " Content-type ", la funzione " Code Engine " utilizza " application/json " come valore predefinito.

Inoltre, il payload JSON viene messo a disposizione della funzione così com'è (come array di byte) in formato Base64-encoded nel parametro " __ce_body.

parametro args dai parametri della query quando si invocano le funzioni
args campo E' pronto? Descrizione
__ce_body Sì Dati della richiestaBase64-encoded)
__ce_headers Sì Il tipo di contenuto è impostato
__ce_query "" Stringa vuota
Proprietà di primo livello Sì Coppia chiave-valore per ogni elemento di primo livello (codificata in testo)

Esempio Python di accesso ai dati di input di '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,
  }

Esempio di accesso ai dati di input di 'application/json in Node.js:

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;

args dai dati della richiesta di tipo content-type application/octet-stream

Una funzione riceve dati binari in formato Base64-encoded per i dati binari '__ce_body nel parametro '__ce_body:

parametro args dai dati della richiesta
args campo E' pronto? Descrizione
__ce_body Sì Dati della richiestaBase64-encoded)
__ce_headers Sì Il tipo di contenuto è impostato
__ce_query "" Stringa vuota
Proprietà di primo livello No

Esempio Python di accesso ai dati di input di '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,
  }

Esempio di accesso ai dati di input di 'application/octet-stream in Node.js:

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;

args dai dati della richiesta di tipo content-type text/plain

Una funzione riceve dati di tipo testo in formato Base64-encoded nel parametro " __ce_body:

parametro args dai dati della richiesta
args campo E' pronto? Descrizione
__ce_body Sì Dati della richiesta (codificati in testo)
__ce_headers Sì Il tipo di contenuto è impostato
__ce_query "" Stringa vuota
Proprietà di primo livello No

La logica del programma della funzione potrebbe aver bisogno di disincapsularli per ricreare i dati originali.

Esempio Python di accesso ai dati di input di '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,
  }

Esempio di accesso ai dati di input di 'text/plain in Node.js:

function main(args) {
  var body  = args.__ce_body  // get complete request body (text encoded)

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

module.exports.main = main;

args dai dati della richiesta di tipo content-type application/x-www-form-urlencoded

Una funzione riceve i dati completi del corpo in formato codificato in testo nel parametro " __ce_body:

parametro args dai dati della richiesta
args campo E' pronto? Descrizione
__ce_body Sì Dati della richiesta (codificati in testo)
__ce_headers Sì Il tipo di contenuto è impostato
__ce_query "" Stringa vuota
Proprietà di primo livello No

Esempio Python di accesso ai dati di input di '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,
  }

Esempio di accesso ai dati di input di 'application/x-www-form-urlencoded in Node.js:

function main(args) {
  var body  = args.__ce_body  //get request body, is url-encoded (%)

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

module.exports.main = main;

parametro args dai dati della richiesta di tipo contenuto 'application/x-www-form-urlencoded e dai parametri della query

Sono possibili tutte le combinazioni di tipi di dati misti, ma si consideri che per le richieste di tipo " HTTP " con parametri di query " URL " e parametri del corpo, i parametri del corpo hanno la precedenza sui parametri di query.

Code Engine variabili d'ambiente della funzione

Mentre i parametri di chiamata delle funzioni derivano dalla richiesta di ingresso dell' HTTP, una funzione di Code Engine ha anche accesso a una serie di variabili di ambiente predefinite derivate dalle impostazioni di sistema:

  • CE_ALLOW_CONCURRENT
  • CE_API_BASE_URL
  • CE_DOMAIN
  • CE_EXECUTION_ENV
  • CE_FUNZIONE
  • ID CE_PROGETTO
  • CE_REGIONE
  • CE_SUBDOMAIN

Per ulteriori informazioni su queste variabili di ambiente, vedere Variabili di ambiente inserite automaticamente.

Esempio di accesso alle variabili d'ambiente Python:

import os

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

Esempio di accesso alle variabili d'ambiente in Node.js:

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;

Interfaccia dati di risposta interna

L'interfaccia interna dei dati di risposta illustra il modo in cui il codice funzione fornisce i dati di risposta. Il servizio funzioni dell' Code Engine e elabora i dati e fornisce una risposta all' HTTP e al chiamante.

Indipendentemente dal linguaggio di programmazione, il codice della funzione deve fornire i dati di risposta come struttura dati nell'istruzione di ritorno.

A seconda del linguaggio di programmazione, l'oggetto risultato è un oggetto JSON (linguaggioNode.js ) o un dizionario (linguaggioPython ) con la seguente struttura:

Struttura dell'oggetto risultato in un oggetto JSON (linguaggioNode.js ) o in un dizionario (linguaggioPython )
Funzioni dati di risultato Requisito Descrizione
headers Facoltativo Un oggetto risultato in cui le chiavi sono nomi di intestazione e i valori sono stringhe, numeri o valori booleani. Per inviare più valori per una singola intestazione, il valore dell'intestazione è un array di valori multipli. Non viene configurata alcuna intestazione per impostazione predefinita.
statusCode Dovrebbe (valore predefinito 200) Un codice di stato HTTP valido.
body Opzionale (predefinito: vuoto) Una stringa che può essere un testo normale, un oggetto o un array JSON o una stringa Base64-encoded per i dati binari. Il corpo viene considerato vuoto se è nullo, una stringa vuota ("") o non definito.

Esempio di struttura di dati dei risultati per fornire i dati dei risultati dell'esecuzione della funzione:

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

Impostare sempre 'body e 'statusCode. L'impostazione implicita di statusCode e body è disponibile solo per compatibilità con le funzioni deprecate di Code Engine.

headers elemento

L'intento principale della sezione delle intestazioni è quello di definire il tipo di contenuto in cui la funzione fornirà i dati della risposta. I dati di risultato supportano l'identico valore " MIME-Type accettato su richiesta.

A seconda del valore di 'Content-Type, il campo body della struttura dei risultati deve contenere i seguenti aspetti:

Struttura del risultato del campo corpo
Tipo di contenuto Valore assegnato all'elemento body Esempio
application/json Oggetto JSON body : { key_1: val1 }
Non impostato (default) Stringa body : "some text"
text/* Stringa body : "some text"
audio/*, example/*, font/', image/*, video/*, e tutti i tipi rimanenti Base64-encoded body: "SGVsbG8gV29ybGQhCg=="

Anche il codice funzione può utilizzare coppie chiave-valore nell'intestazione della risposta dell' HTTP e per fornire dati di risposta. Pertanto, il codice deve inserire il nome di una chiave univoca e il suo valore nella sezione delle intestazioni della struttura dati utilizzata nell'istruzione di ritorno.

Prendete nota di queste considerazioni chiave sui nomi:

  • I nomi delle chiavi non tengono conto delle maiuscole e delle minuscole
  • Viene utilizzata l'assegnazione di valore più recente di nomi di chiavi identici
  • I backslash o gli spazi vuoti non sono supportati

Prendete nota di queste considerazioni sul valore:

  • I valori devono essere codificati come testo
  • I valori devono essere di tipo stringa o array di stringhe

Esempio di restituzione dei dati di risposta come coppia chiave-valore dell'intestazione:

import os
def main(args):

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

statusCode elemento

Il codice delle funzioni deve impostare esplicitamente un codice di stato (predefinito '200) per informare il chiamante sul risultato dell'esecuzione. È possibile utilizzare qualsiasi codice di stato di ritorno valido dell' HTTP, ovvero il codice di stato 200 a 599.

Il servizio funzioni dell' Code Engine e restituisce il codice di stato della funzione nel campo dell'intestazione (x-faas-actionstatus) e come codice di stato dell' HTTP.

Se l' statusCode e non è valido, il servizio funzioni dell' Code Engine e restituisce il codice di ritorno " HTTP " ( 422, "Codice funzione non valido, non può essere elaborato") senza il campo di intestazione " x-faas-actionstatus " e senza dati di risposta aggiuntivi.

Se viene raggiunto il limite di dimensione del risultato per le funzioni, al client viene restituito un codice di stato di errore ( HTTP ) " 400 ".

Esempio di restituzione del codice di stato della risposta:

import os
  def main(args):

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

body elemento

Il codice della funzione può includere la sezione " body della struttura dei dati di ritorno per fornire i dati di risposta della funzione. Il codice della funzione è responsabile della consegna dell'elemento " body nella struttura dati di ritorno in formato corrispondente al " Content-Type. Se manca la risposta della funzione " Content-Type, il codice della funzione restituisce " Content-Type: text/plain; charset=utf-8 all'interfaccia esterna e i dati del campo " body nella loro forma inalterata.

Si considerino le seguenti regole del corpo, a seconda del tipo di contenuto utilizzato.

Valore del corpo del tipo di contenuto " application/json

Il codice della funzione deve fornire il valore dell'elemento 'body come struttura dati validaNodeJs-JSON o Python). Le chiavi e i valori della struttura dati devono seguire le regole di sintassi JSON in modo che il servizio Code Engine possa fornire i dati di risposta nella sezione dati di risposta application/json HTTP.

I backslash (\) e le doppie virgolette (") nella struttura dei dati vengono forniti in formato codificato in testo nella sezione dei dati di risposta HTTP.

Esempio Python di risposta " 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,
    }

Esempio di risposta Node.js '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;

Valore del corpo del tipo di contenuto " application/octet-stream

I dati del risultato per il codice funzione devono essere Base64-encoded prima di essere aggiunti alla struttura del risultato.

Esempio Python di risposta " 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,
  }

Esempio di risposta Node.js '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;

Valore del corpo del tipo di contenuto " text/plain

Il codice funzione deve fornire l'intera risposta in un'unica stringa. Il servizio di funzioni Code Engine non controlla i dati di risposta; i dati vengono trasferiti al chiamante come previsto.

Esempio Python di risposta " text/plain:

def main(args):
  result_body = "myfolder_myFile"

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

Valore del corpo del tipo di contenuto 'application/x-www-form-urlencoded (contenuto codificato in percentuale)

Il codice funzione deve garantire che i dati di risposta siano codificati con l' URL, prima di essere aggiunti alla struttura dei dati di risultato. Il servizio funzioni dell' Code Engine e non controlla la correttezza della sintassi dei dati di risposta. I dati vengono trasferiti al chiamante come previsto.

Esempio Python di risposta " 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,
  }

Interfaccia dati di risposta esterna

La definizione dell'interfaccia dati esterna deriva dallo standard HTTP. I tipi MIME nell'intestazione della risposta HTTP vengono utilizzati per definire il formato della risposta HTTP.

Tipi MIME

Quando Code Engine restituisce dati al mondo esterno, le funzioni di Code Engine possono supportare gli stessi tipi MIME IANA descritti in Tipi MIME.

Dati risposta

L'interfaccia dati esterna restituisce la struttura dati di risposta come un'intestazion HTTP, un codice di stato HTTP, e dati di risposta HTTP i al chiamante della funzione.

HTTP campi di intestazione

L'intestazione " HTTP " contiene tutte le coppie chiave-valore che il codice funzione ha aggiunto alla struttura dati del risultato.

Il servizio di funzioni Code Engine aggiunge le seguenti coppie chiave-valore:

Coppie chiave-valore nelle funzioni di Code Engine
Nome campo Descrizione
x-request-id L'ID della richiesta esterna per la funzione invocata.
x-faas-activation-id L'ID interno del servizio di funzioni Code Engine per l'invocazione.
x-faas-actionstatus Il codice di stato del codice funzione impostato.

I nomi delle chiavi d'intestazione sono sempre ribattuti in minuscolo.

Codice di stato HTTP

L'origine del codice di stato dell' HTTP e può essere il servizio funzioni dell' Code Engine e stesso o il codice di stato impostato dal codice funzione. La presenza del campo di intestazione " x-faas-statuscode è l'indicatore dell'origine.

Il significato del codice di stato dell' HTTP e può essere letto nella documentazione delle funzioni dell' Code Engine e se il campo dell'intestazione dell' x-faas-actionstatus e non è impostato. Tuttavia, se il campo di intestazione è impostato, la logica della funzione definisce il significato del codice di stato dell' HTTP.

Code Engine il servizio funzioni esegue un controllo di validità limitato sui dati e sul tipo di contenuto della risposta e restituisce un codice di stato HTTP di 400 se il formato o la codifica dei dati (generati dal codice funzione) non sono validi.

HTTP dati di risposta

I dati di risposta dell' HTTP e sull'interfaccia dati esterna sono identici a quelli forniti nella struttura dati dei risultati dal codice funzione. Solo se il 'MIME-Type è 'application/json, la chiave e i valori nella risposta JSON fornita vengono modificati. Tutti i backslash e le virgolette doppie vengono evasi.

Ad esempio, il chiamante riceve i dati di risposta " application/json. Il codice funzione che fornisce i dati di risposta è il seguente:

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

Il client 'curl che utilizza i campi 'statusCcode, 'header e i dati della risposta è il seguente:

  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

esempi di invocazione di funzioni Code Engine

Seguite questi passaggi per vedere la creazione di una funzione Code Engine con la CLI e l'uso dell'interfaccia dati esterni:

  1. Salvare localmente il seguente codice come hello.js:

    function main(args) {
      return { headers: { content_type: "application/json" },
        statusCode: 200,
        body: {args: args}
      };
    }
    
  2. Dopo essersi collegati a IBM Cloud® e aver selezionato il servizio di funzioni Code Engine, creare una nuova funzione:

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

    Output di esempio:

    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. Utilizzare l'interfaccia dati esterna con un comando 'curl per richiamare la funzione:

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

    Output di esempio:

    {
        "args": {
            "__ce_headers": {
            "Accept": "*/*",
            "User-Agent": "curl/7.58.0",
            "X-Request-Id": "813804ec-ef14-42e9-bce3-c162373defae"
            },
            "__ce_method": "GET",
            "__ce_path": "/"
        }
    }
    
  4. Invocare la funzione utilizzando i parametri della query:

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

    Output di esempio:

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

    Il parametro della query è disponibile non modificato negli argomenti e anche in '__ce_query.

  5. Invocare la funzione utilizzando i dati del modulo:

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

    Output di esempio:

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

    Il contenuto del corpo della richiesta è disponibile senza modifiche nell'argomento " __ce_body, con i caratteri riservati a JSON che vengono evasi.

  6. Invocare la funzione utilizzando un oggetto dati JSON:

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

    Output di esempio:

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

    Il contenuto del corpo della richiesta è disponibile negli argomenti della funzione (args) con i caratteri riservati JSON che vengono evasi e anche non modificati come stringa Base64-encoded in '__ce_body.

  7. Invocare la funzione utilizzando i dati JSON e i parametri della query:

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

    Output di esempio:

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

    I parametri del corpo e i parametri della query vengono dispiegati negli argomenti della funzione (args). I parametri del corpo sovrascrivono i parametri della query. Il corpo della richiesta è disponibile in '__ce_body (Base64-encoded). I parametri della query sono disponibili in '__ce_query.

  8. Invocare la funzione utilizzando il tipo di contenuto testo:

    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
    

    Output di esempio:

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

    Il contenuto del corpo della richiesta è disponibile senza modifiche in '__ce_body, ma con caratteri speciali JSON sfuggiti con '\\ o '\.

  9. Invocare la funzione utilizzando il tipo di contenuto binario:

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

    Output di esempio:

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