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
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:
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:
Campo de args |
¿Está listo? | Descripción |
---|---|---|
__ce_body |
No | Cuerpo |
__ce_headers |
Sí | Cabecera sin content-type |
__ce_query |
Sí | Parámetro de consulta (codificado con URL ) |
Propiedad de nivel superior | Sí | 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
:
Campo de args |
¿Está listo? | Descripción |
---|---|---|
__ce_body |
No | Cuerpo |
__ce_headers |
Sí | 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
".
Campo de args |
¿Está listo? | Descripción |
---|---|---|
__ce_body |
Sí | Datos de la solicitudBase64-encoded) |
__ce_headers |
Sí | Se ha establecido el tipo de contenido |
__ce_query |
"" | Serie vacía |
Propiedad de nivel superior | Sí | 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
':
Campo de args |
¿Está listo? | Descripción |
---|---|---|
__ce_body |
Sí | Datos de la solicitudBase64-encoded) |
__ce_headers |
Sí | 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
':
Campo de args |
¿Está listo? | Descripción |
---|---|---|
__ce_body |
Sí | Datos de la solicitud (codificados en texto) |
__ce_headers |
Sí | 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
":
Campo de args |
¿Está listo? | Descripción |
---|---|---|
__ce_body |
Sí | Datos de la solicitud (codificados en texto) |
__ce_headers |
Sí | 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:
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:
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:
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:
-
Guarde el siguiente código como
hello.js
localmente:function main(args) { return { headers: { content_type: "application/json" }, statusCode: 200, body: {args: args} }; }
-
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 ...
-
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": "/" } }
-
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
. -
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. -
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
. -
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
. -
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 '\
. -
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": "/" } }