IBM Cloud Docs
Intercambio de datos con funciones

Intercambio de datos con funciones

La invocación de un servicio de funciones de Code Engine (o simplemente una función) se realiza en el lado del cliente a través de solicitudes de tipo HTTP. Se puede pasar información a la función de las siguientes maneras:

  • Como parte de la dirección de red ( URL ) (ruta y, opcionalmente, parámetros de consulta)
  • A través de las cabeceras de solicitud de HTTP
  • A través del cuerpo de la solicitud HTTP

Una persona que llama recibe estos valores en el lado del cliente como una respuesta de tipo " HTTP ". Los datos de respuesta pasan como sigue:

  • Como código de respuesta de HTTP
  • A través de los encabezados de respuesta de HTTP
  • A través del cuerpo de respuesta de HTTP

Todas las reglas y capacidades para invocar una función a través de solicitudes de tipo " HTTP " y las respuestas de tipo " HTTP " resultantes constituyen la interfaz de datos externa.

Una solicitud de HTTP e entrante se reenvía al código de función para su procesamiento utilizando las reglas de la interfaz de datos de solicitud interna. Los resultados que proporciona el código de función deben seguir las reglas de la interfaz interna de datos de respuesta.

El siguiente diagrama muestra el flujo de información de un cliente que utiliza la interfaz de datos externa. El proceso utiliza el servicio de funciones Code Engine y la interfaz interna de datos de solicitud para el código de la función. Del mismo modo, los datos resultantes fluyen desde el código de la función a la interfaz de datos de respuesta interna a través del servicio de funciones Code Engine, y la interfaz de datos externa fluye de vuelta a la persona que llama.

Interfaces de

Functions.
Information flow for Code Engine functions

Interfaz de datos de solicitud externa

La definición de la interfaz de datos externa se deriva de la norma HTTP.

Tipos Mime

Los tipos MIME se utilizan para definir el formato de la información de la solicitud HTTP y la respuesta HTTP.

Los siguientes tipos MIME de IANA son compatibles con el tipo de contenido (Content-Type) de las solicitudes HTTP o las respuestas HTTP. Se admiten parámetros de tipo MIME, pero no se incluyen en esta lista:

  • Tipo JSON:
    • application/json; <parameters>
  • Tipos binarios:
    • audio/*; <parameters>
    • application/octet-stream; <parameters>
    • example/*; <parameters>
    • font/*; <parameters>
    • image/*; <parameters>
    • model/*; <parameters>
    • multipart/*; <parameters>
    • video/*; <parameters>
  • Tipos de texto:
    • text/plain; <parameters>
    • text/html; <parameters>
    • text/*; <parameters>
  • Tipo codificado por porcentaje:
    • application/x-www-form-urlencoded; <parameters>

Datos de solicitud

Cuando se invoca una función, puede recibir datos arbitrarios (carga útil de solicitud) en formato de texto o binario. La presencia de un valor " Content-Type " en el encabezado de la solicitud " HTTP " determina la forma y la codificación de los datos que se envían a la función. La estructura de datos, el formato y el tipo de contenido deben coincidir. El servicio de funciones de Code Engine ejecuta una comprobación de validación mínima de los datos teniendo en cuenta el tipo de contenido y responde con el código de estado HTTP 400 en ciertos casos; por ejemplo, si el formato de datos JSON o la codificación no son válidos.

Para todos los demás valores " Content-Type " seleccionados, se espera que el formato de los datos coincida con las restricciones del tipo MIME.

Proporcionar datos de solicitud como parámetros de consulta

Los datos solicitados pueden proporcionarse como pares clave-valor en formato codificado con URL, también llamado codificado con porcentaje, en el archivo HTTP URL.

La codificación de porcentaje se utiliza ampliamente en la tecnología web. Todos los caracteres de 8 bits se escriben como valores hexadecimales precedidos por un signo de porcentaje (%). Este tipo de codificación también se conoce como codificación URL.

Ejemplo de invocación de una función mediante parámetros de consulta:

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

Proporcionar los datos de la solicitud en el cuerpo de la misma

Los datos de la solicitud se proporcionan en el cuerpo de la solicitud HTTP. El formato de los datos debe coincidir con el valor " Content-Type " proporcionado.

Ejemplos de invocación de una función utilizando datos del cuerpo en 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

Ejemplo de invocación de una función mediante datos del cuerpo en 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 falta el valor ' Content-Type ' para una solicitud, Code Engine gestiona la carga útil de datos como se describe para ' application/json.

Proporcionar datos de cabecera de la solicitud

Los datos de la solicitud se proporcionan en pares clave-valor en la sección de encabezado de la solicitud HTTP.

Ejemplo de invocación de una función mediante campos de cabecera:

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

Proporcionar datos mixtos de la solicitud

Code Engine las funciones admiten el uso de diferentes formas de proporcionar datos de solicitud dentro de una única solicitud de HTTP.

Ejemplo de invocación de una función utilizando los datos del cuerpo y los campos de cabecera:

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

Ejemplo de invocación de una función utilizando datos del cuerpo, cabeceras y parámetros de consulta:

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

Interfaz de datos de solicitud interna

La interfaz de datos de solicitud interna describe cómo el servicio de funciones Code Engine entrega los datos de solicitud que se reciben en la interfaz de datos externa al código de función. Independientemente del lenguaje de codificación, puede implementar la lógica de función para poner todos los parámetros de solicitud en la función main() como primer parámetro.

Puede utilizar cualquier nombre para este parámetro; en los ejemplos siguientes, el parámetro se denomina " args.

Además, el código de la función recibe un conjunto de variables de entorno predefinidas que se inyectan automáticamente.

Ejemplo de 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 ejemplo:

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;

El servicio de funciones Code Engine utiliza diferentes codificaciones para los datos de entrada para ayudar a garantizar que el código de la función pueda acceder a los datos de entrada en el argumento ' args. Las codificaciones ayudan a garantizar que los datos estructurados, el texto sin formato, los datos y los datos binarios puedan formar parte de los datos de entrada.

Codificación del texto

La codificación de texto se utiliza para los elementos del parámetro de entrada ' args ' que contienen carga útil de texto. La codificación es necesaria para ayudar a garantizar que los caracteres especiales se escapen y no dañen la estructura de datos del parámetro ' args '.

Code Engine ejecuta la codificación del contenido del texto antes de llamar a la función main(). La lógica del programa de la función podría tener que desescaparlos para volver a crear los datos originales.

Caracteres de escape soportados:

  • El retroceso se sustituye por \b.
  • El canal de información de formulario se sustituye por \f.
  • La nueva línea se sustituye por \n.
  • El retorno de carro se sustituye por \r.
  • La pestaña se sustituye por \t.
  • Las comillas dobles se sustituyen por \".
  • La barra invertida se sustituye por \\.

Codificación en Base64

La codificación Base64 se utiliza para los elementos del parámetro de entrada ' args ' que pueden romper la estructura de datos interna del parámetro ' args '. Codificarlo como Base64 ayuda a garantizar que todo el valor esté formado sólo por caracteres legibles en un alfabeto de 64 caracteres.

Por ejemplo:

"eyAicGxhbmV0MSI6Ik1hcnMiLCAicGxhbmV0MiI6Ikp1cGl0ZXIiIH0="

Codificación de porcentaje (codificación URL )

La codificación de porcentaje se utiliza ampliamente en la tecnología web. Todos los caracteres de 8 bits se escriben como valor hexadecimal precedido de un signo de porcentaje (%). Este tipo de codificación también se conoce como codificación URL. La función recibe los datos de tipo " form-urlencoded " en formato bruto en el parámetro " __ce_body ".

El servicio de funciones Code Engine pasa los parámetros de la consulta tal cual (el ' ? ' inicial no forma parte de ella) al campo ' __ce_query ' del parámetro ' args '. De esta manera, el código de función recibe este parámetro en formato codificado con URL; por ejemplo:

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

El parámetro " args

El parámetro ' args ' es una estructura de datos específica del lenguaje (objeto JSON para Node.js y tipo ' dict ' (diccionario) para Python) rellenada con los datos de entrada de la solicitud en el siguiente formato:

Elementos de nivel superior Descripción
__ce_<service_variable> Code Engine argumento de entrada interno del servicio.
__ce_headers Una copia del elemento de cabecera de la solicitud de HTTP.
<property> (opcional) Propiedades de nivel superior disponibles si los datos de entrada de la solicitud HTTP se proporcionan en formato estructurado (solo si se utiliza un tipo de contenido application/json ).
{: caption="Elementos para el parámetro ' 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"
      }
  }

parámetro args ' fijado para argumentos de entrada internos (__ce_*)

El servicio de funciones Code Engine inyecta argumentos de entrada reservados a los datos de entrada ' args.

Los siguientes parámetros pueden aparecer en el argumento ' args ' dependiendo de cómo el llamante proporcione los datos de la solicitud:

Parámetros para los argumentos de entrada de una función Code Engine
Nombre de parámetro Tipo de valor Descripción
__ce_method Serie El método de solicitud de HTTP (ya sea una solicitud GET o POST).
__ce_headers Mapa de pares clave-valor Pares clave-valor del encabezado de solicitud de HTTP.
__ce_path Serie URL ruta de la solicitud de HTTP encia entrante.
__ce_body Serie La entidad de cuerpo de solicitud, como una serie Base64-encoded cuando el tipo de contenido de solicitud es binario, o como una serie sin formato, de lo contrario.
__ce_query Serie Parámetros de la consulta procedentes de la solicitud como serie sin analizar. El parámetro __ce_query es una sola cadena que contiene los parámetros de consulta que se analizan desde el URL, sin el signo de interrogación inicial (?), y separados por un signo de unión (&).

Los parámetros de __ce_* internos no se pueden sobrescribir con los datos de solicitud que se proporcionan en la solicitud de HTTP. HTTP llamadas que intentan sobrescribir fallan con el código de estado " 400 " (Solicitud incorrecta).

Contenido del parámetro " args " si el autor de la llamada proporciona los datos de la solicitud mediante parámetros de consulta

Una función recibe datos de parámetros de consulta como pares clave-valor en el parámetro __ce_query, y está codificada en porcentaje (codificada en URL ). Además, cada parámetro de consulta es un par clave-valor en el formato descodificado:

parámetro args de los parámetros de consulta al invocar funciones
Campo de args ¿Está listo? Descripción
__ce_body No Cuerpo
__ce_headers Cabecera sin content-type
__ce_query Parámetro de consulta (codificado con URL )
Propiedad de nivel superior Par clave-valor ( URL-decoded y text-encoded)

Ejemplo Python de acceso a parámetros de consulta:

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

Ejemplo de Node.js de acceso a parámetros de consulta:

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;

Contenido del parámetro " args " si el autor de la llamada proporciona los datos de la solicitud mediante datos de cabecera

Una función recibe los datos de cabecera de la solicitud como pares clave-valor en el parámetro ' __ce_headers '. El par clave-valor se convierte a un formato canónico, independientemente del formato que tenga la clave en la interfaz de datos externa. Por ejemplo, tanto " mykey como " MYKEY " se convierten en " Mykey:

parámetro args de los parámetros de cabecera al invocar funciones
Campo de args ¿Está listo? Descripción
__ce_body No Cuerpo
__ce_headers Cabecera en par clave-valor (codificada en texto) (la clave está en formato canónico).
__ce_query "" El parámetro de consulta es una cadena vacía.
Propiedad de nivel superior No

Ejemplo Python de acceso a datos de cabecera:

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

Ejemplo de Node.js de acceso a datos de cabecera:

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;

parámetro "args " de los datos de la solicitud de tipo de contenido " application/json

Una función recibe las claves y los valores del documento JSON como parámetros de propiedad de nivel superior dedicados.

Cuando no se establece ningún valor para Content-type en la solicitud HTTP, la función Code Engine utiliza application/json de forma predeterminada.

Además, la carga útil JSON se pone a disposición de la función tal cual (como matriz de bytes) en formato Base64-encoded en el parámetro " __ce_body ".

parámetro args de los parámetros de consulta al invocar funciones
Campo de args ¿Está listo? Descripción
__ce_body Datos de la solicitudBase64-encoded)
__ce_headers Se ha establecido el tipo de contenido
__ce_query "" Serie vacía
Propiedad de nivel superior Par clave-valor para cada elemento de nivel superior (codificado en texto)

Ejemplo Python de acceso a los datos de entrada ' 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,
  }

Ejemplo de Node.js de acceso a datos de entrada ' 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;

parámetro "args " de los datos de la solicitud de tipo de contenido " application/octet-stream

Una función recibe datos binarios en formato Base64-encoded para los datos binarios ' __ce_body ' en el parámetro ' __ce_body ':

parámetro args de los datos de la solicitud
Campo de args ¿Está listo? Descripción
__ce_body Datos de la solicitudBase64-encoded)
__ce_headers Se ha establecido el tipo de contenido
__ce_query "" Serie vacía
Propiedad de nivel superior No

Ejemplo Python de acceso a los datos de entrada ' 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,
  }

Ejemplo de Node.js de acceso a datos de entrada ' 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;

parámetro "args " de los datos de la solicitud de tipo de contenido " text/plain

Una función recibe datos de tipo texto en formato Base64-encoded en el parámetro ' __ce_body ':

parámetro args de los datos de la solicitud
Campo de args ¿Está listo? Descripción
__ce_body Datos de la solicitud (codificados en texto)
__ce_headers Se ha establecido el tipo de contenido
__ce_query "" Serie vacía
Propiedad de nivel superior No

La lógica del programa de la función podría tener que desescaparlos para volver a crear los datos originales.

Ejemplo Python de acceso a los datos de entrada ' 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,
  }

Ejemplo de Node.js de acceso a datos de entrada ' 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;

parámetro "args " de los datos de la solicitud de tipo de contenido " application/x-www-form-urlencoded

Una función recibe los datos completos del cuerpo en formato de texto codificado en el parámetro " __ce_body ":

parámetro args de los datos de la solicitud
Campo de args ¿Está listo? Descripción
__ce_body Datos de la solicitud (codificados en texto)
__ce_headers Se ha establecido el tipo de contenido
__ce_query "" Serie vacía
Propiedad de nivel superior No

Ejemplo Python de acceso a los datos de entrada ' 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,
  }

Ejemplo de Node.js de acceso a datos de entrada ' 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;

parámetro 'args ' a partir de datos de solicitud de tipo de contenido ' application/x-www-form-urlencoded y parámetros de consulta

Todas las combinaciones de tipos de datos mixtos son posibles, pero tenga en cuenta que para las solicitudes de tipo " HTTP " con parámetros de consulta " URL " y parámetros de cuerpo, los parámetros de cuerpo tienen prioridad sobre los parámetros de consulta.

Variables de entorno de la función Code Engine

Mientras que los parámetros de llamada de función se derivan de la solicitud de entrada de HTTP, una función de Code Engine también tiene acceso a un conjunto de variables de entorno predefinidas derivadas de la configuración del sistema:

  • CE_ALLOW_CONCURRENT
  • CE_API_BASE_URL
  • CE_DOMAIN
  • CE_EXECUTION_ENV
  • CE_FUNCIÓN
  • CE_PROJECT_ID
  • CE_REGIÓN
  • CE_SUBDOMAIN

Para obtener más información sobre estas variables de entorno, consulte Variables de entorno inyectadas automáticamente.

Ejemplo Python de acceso a variables de entorno:

import os

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

Ejemplo de Node.js de acceso a variables de entorno:

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;

Interfaz de datos de respuesta interna

La interfaz interna de datos de respuesta describe cómo el código de función proporciona los datos de respuesta. El servicio de funciones de Code Engine procesa los datos y proporciona una respuesta e HTTP e a la persona que llama.

Independientemente del lenguaje de programación, el código de la función debe proporcionar los datos de respuesta como estructura de datos en la sentencia return.

Dependiendo del lenguaje de programación, el objeto resultante es un objeto JSON (lenguajeNode.js ') o un diccionario (lenguajePython ') con la siguiente estructura:

Estructura del objeto resultante en un objeto JSON (lenguajeNode.js ) o un diccionario (lenguajePython )
Funciones datos resultado Requisito Descripción
headers Opcional Un objeto de resultado en el que las claves son nombres de encabezado y los valores son cadenas, números o valores booleanos. Para enviar varios valores para un único encabezado, el valor del encabezado es una matriz de los múltiples valores. No hay ninguna cabecera establecida de forma predeterminada.
statusCode Debería (por defecto 200) Un código de estado HTTP válido.
body Opcional (por defecto: vacío) Una cadena que puede ser texto sin formato, un objeto o matriz JSON, o una cadena Base64-encoded para datos binarios. El cuerpo se considera vacío si es nulo, una cadena vacía ("") o indefinido.

Estructura de datos de resultados de ejemplo para proporcionar datos de resultados de ejecución de funciones:

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

Always set body and statusCode. El ajuste implícito de ' statusCode y body sólo está disponible por compatibilidad con funciones Code Engine obsoletas.

Elemento de headers

La intención principal de la sección de cabeceras es definir el tipo de contenido en el que la función va a proporcionar los datos de respuesta. Los datos resultantes admiten el mismo valor " MIME-Type " que el aceptado en la solicitud.

En función del valor de " Content-Type ", el campo body de la estructura resultante deberá contener los siguientes aspectos:

Estructura de resultados del campo corporal
Tipo de contenido Valor que se asigna al elemento body Ejemplo
application/json Objeto JSON body : { key_1: val1 }
No configurado (por defecto) Serie body : "some text"
text/* Serie body : "some text"
audio/*, example/*, font/', image/*, video/*, and all remaining types Base64-encoded body: "SGVsbG8gV29ybGQhCg=="

Además, el código de función puede utilizar pares clave-valor en el encabezado de respuesta HTTP para proporcionar datos de respuesta. Por lo tanto, el código debe poner un nombre de clave único y su valor en la sección de encabezados de la estructura de datos que se utiliza en la sentencia return.

Tome nota de estas consideraciones clave sobre el nombre:

  • Los nombres de las claves no distinguen mayúsculas de minúsculas
  • Se utiliza la asignación de valores más reciente de nombres de clave idénticos
  • No se admiten barras invertidas ni espacios en blanco

Tenga en cuenta estas consideraciones de valor:

  • Los valores deben estar codificados en texto
  • Los valores deben ser de tipo cadena o matriz de cadenas

Ejemplo de devolución de datos de respuesta como un par clave-valor de cabecera:

import os
def main(args):

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

Elemento de statusCode

El código de las funciones debe establecer explícitamente un código de estado (por defecto ' 200) para informar a quien llama sobre el resultado de la ejecución. Puede utilizar cualquier código de estado de devolución válido de HTTP (es decir, el código de estado 200 a 599).

El servicio de funciones de Code Engine devuelve el código de estado de la función en el campo de encabezado (x-faas-actionstatus) y como código de estado de HTTP.

Si el statusCode no es válido, el servicio de funciones Code Engine devuelve el código de retorno HTTP 422 (No se puede procesar el código de función no válido) sin el campo de encabezado x-faas-actionstatus y sin datos de respuesta adicionales.

Si se alcanza el límite de tamaño de resultado para las funciones, se devuelve al cliente un código de estado de error de red ( HTTP ) de 400.

Ejemplo de devolución de código de estado de respuesta:

import os
  def main(args):

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

Elemento de body

El código de la función puede incluir la sección " body " de la estructura de datos de retorno para proporcionar los datos de respuesta de la función. El código de la función se encarga de entregar el elemento " body " de la estructura de datos de retorno en formato coincidente con el " Content-Type. Si falta la respuesta de la función " Content-Type ", el código de la función devuelve " Content-Type: text/plain; charset=utf-8 en la interfaz externa, y los datos del campo " body " en su forma inalterada.

Considere las siguientes reglas del cuerpo, en función del tipo de contenido utilizado.

Valor del cuerpo del content-type ' application/json

El código de la función debe proporcionar el valor del elemento " body " como una estructura de datos válidaNodeJs-JSON o Python). Las claves y los valores de la estructura de datos deben seguir las reglas de sintaxis JSON para que el servicio Code Engine pueda entregar los datos de respuesta en la sección de datos de respuesta application/json HTTP.

Las barras invertidas (\) y las comillas dobles (") en la estructura de datos se entregan en formato de texto codificado en la sección de datos de respuesta de HTTP.

Ejemplo Python de una respuesta ' 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,
    }

Ejemplo Node.js de una respuesta ' 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;

Valor del cuerpo del content-type ' application/octet-stream

Los datos de resultado del código de función deben Base64-encoded antes de añadirlos a la estructura de resultados.

Ejemplo Python de una respuesta ' 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,
  }

Ejemplo Node.js de una respuesta ' 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;

Valor del cuerpo del content-type ' text/plain

El código de la función debe proporcionar toda la respuesta en una sola cadena. El servicio de funciones Code Engine no comprueba los datos de respuesta; los datos se transfieren a la persona que realiza la llamada tal como se proporcionan.

Ejemplo Python de una respuesta ' text/plain:

def main(args):
  result_body = "myfolder_myFile"

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

Valor del cuerpo del tipo de contenido " application/x-www-form-urlencoded (contenido codificado en porcentaje)

El código de función debe ayudar a garantizar que los datos de respuesta estén codificados con el códig URL antes de que se añadan a la estructura de datos de resultados. El servicio de funciones de Code Engine no comprueba la sintaxis correcta de los datos de respuesta. Los datos se transfieren a la persona que llama según lo previsto.

Ejemplo Python de una respuesta ' 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,
  }

Interfaz de datos de respuesta externa

La definición de la interfaz de datos externa se deriva de la norma HTTP. Los tipos MIME en el encabezado de respuesta de HTTP se utilizan para definir el formato de la respuesta de HTTP.

Tipos Mime

Cuando " Code Engine " devuelve datos al mundo externo, las funciones " Code Engine " pueden admitir los mismos tipos MIME IANA que se describen en " Tipos MIME.

Datos de respuesta

La interfaz de datos externa devuelve la estructura de datos de respuesta como un encabezado ( HTTP ), un código de estado ( HTTP ) y datos de respuesta ( HTTP ) al llamante de la función.

campos de cabecera HTTP

El encabezado " HTTP " contiene todos los pares clave-valor que el código de función añadió a la estructura de datos de resultados.

El servicio de funciones Code Engine añade los siguientes pares clave-valor:

Pares clave-valor en funciones Code Engine
Nombre de campo Descripción
x-request-id El ID de la petición externa para la función invocada.
x-faas-activation-id El ID interno del servicio de funciones Code Engine para la invocación.
x-faas-actionstatus El código de estado el código de función establecido.

Los nombres de las claves de cabecera se responden siempre en minúsculas.

Código de estado HTTP

El origen del código de estado de la función HTTP puede ser el propio servicio de funciones de Code Engine o el código de estado establecido por el código de función. La presencia del campo de cabecera " x-faas-statuscode " es el indicador del origen.

El significado del código de estado HTTP puede leerse en la documentación de funciones de Code Engine si el campo de encabezado x-faas-actionstatus no está configurado. Sin embargo, si el campo de encabezado está establecido, entonces la lógica de la función define el significado del código de estado de la función HTTP.

Code Engine funciones El servicio ejecuta una comprobación de validez limitada en los datos de respuesta y el tipo de contenido, y devuelve un código de estado HTTP de 400 si el formato de datos o la codificación (generada por el código de función) no son válidos.

HTTP datos de respuesta

Los datos de respuesta de la interfaz de datos externa ( HTTP ) son idénticos a los suministrados en la estructura de datos de resultados por el código de función. Sólo si ' MIME-Type ' es ' application/json ' se modifican la clave y los valores en la respuesta JSON proporcionada. Se escapan todas las barras invertidas y las comillas dobles.

Por ejemplo, la persona que llama recibe datos de respuesta " application/json ". El código de función que proporciona los datos de respuesta es el siguiente:

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

El cliente ' curl ' que utiliza la respuesta ' statusCcode, los campos ' header, y los datos de respuesta, es el siguiente:

  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

Code Engine ejemplos de invocación de funciones

Siga estos pasos para ver la creación de una función Code Engine con la CLI y el uso de la interfaz de datos externa:

  1. Guarde el siguiente código como hello.js localmente:

    function main(args) {
      return { headers: { content_type: "application/json" },
        statusCode: 200,
        body: {args: args}
      };
    }
    
  2. Después de conectarte a ' IBM Cloud® ' y seleccionar el servicio de funciones ' Code Engine ', crea una nueva función:

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

    Salida de ejemplo:

    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. Utilice la interfaz de datos externa con un comando " curl " para invocar la función:

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

    Salida de ejemplo:

    {
        "args": {
            "__ce_headers": {
            "Accept": "*/*",
            "User-Agent": "curl/7.58.0",
            "X-Request-Id": "813804ec-ef14-42e9-bce3-c162373defae"
            },
            "__ce_method": "GET",
            "__ce_path": "/"
        }
    }
    
  4. Invocar la función utilizando parámetros de consulta:

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

    Salida de ejemplo:

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

    El parámetro de consulta está disponible desplegado en los argumentos y también sin modificar en ' __ce_query.

  5. Invocar la función utilizando los datos del formulario:

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

    Salida de ejemplo:

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

    El contenido del cuerpo de la petición está disponible sin modificar en el argumento ' __ce_body ' con caracteres JSON-reservados que están siendo escapados.

  6. Invoca la función utilizando un objeto de datos JSON:

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

    Salida de ejemplo:

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

    El contenido del cuerpo de la solicitud está disponible desplegado en los argumentos de la función (args) con caracteres reservados JSON que están siendo escapados y también sin modificar como una cadena Base64-encoded en ' __ce_body.

  7. Invoca la función utilizando datos JSON y parámetros de consulta:

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

    Salida de ejemplo:

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

    Los parámetros del cuerpo y los parámetros de consulta se desdoblan en los argumentos de la función (args). Los parámetros del cuerpo sobrescriben los parámetros de consulta. El cuerpo de la solicitud está disponible en ' __ce_body ' (Base64-encoded). Los parámetros de consulta están disponibles en ' __ce_query.

  8. Invocar la función utilizando el tipo de contenido texto:

    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
    

    Salida de ejemplo:

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

    El contenido del cuerpo de la solicitud está disponible sin modificar en ' __ce_body, pero con caracteres especiales JSON escapados con ' \\ o ' \.

  9. Invocar la función utilizando el tipo de contenido binario:

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

    Salida de ejemplo:

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