Trocando dados com funções
A chamada de um serviço de funções Code Engine (ou simplesmente uma função) é realizada no lado do cliente por meio de solicitações HTTP. As informações podem ser passadas para a função das seguintes maneiras:
- Como parte do site URL (caminho e, opcionalmente, parâmetros de consulta)
- Por meio dos cabeçalhos de solicitação HTTP
- Por meio do corpo da solicitação HTTP
Um chamador recebe esses valores no lado do cliente como uma resposta HTTP. Os dados de resposta são transmitidos da seguinte forma:
- Conforme o código de resposta HTTP
- Por meio dos cabeçalhos de resposta do site HTTP
- Por meio do corpo da resposta HTTP
Todas as regras e recursos para invocar uma função por meio de solicitações HTTP e as respostas HTTP resultantes são a interface de dados externos.
Uma solicitação de entrada HTTP é encaminhada ao código de função para processamento usando as regras da interface de dados de solicitação interna. Os resultados fornecidos pelo código de função devem seguir as regras da interface de dados de resposta interna.
O diagrama a seguir mostra o fluxo de informações de um cliente que usa a interface de dados externos. O processo usa o serviço de funções Code Engine e a interface de dados de solicitação interna para o código de função. Da mesma forma, os dados resultantes fluem do código de função para a interface de dados de resposta interna por meio do serviço de funções Code Engine, e a interface de dados externa flui de volta para o chamador.
Interface de dados de solicitação externa
A definição da interface de dados externos é derivada do site padronizado HTTP.
Tipos Mime
Os tipos MIME são usados para definir o formato das informações da solicitação HTTP e da resposta HTTP.
Os seguintes tipos de MIME da IANA são compatíveis com o tipo de conteúdo (Content-Type
) das solicitações HTTP ou das respostas HTTP. Os parâmetros de tipo MIME são compatíveis, mas não estão incluídos nessa lista:
- Tipo JSON:
application/json; <parameters>
- Tipos binários:
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 porcentagem:
application/x-www-form-urlencoded; <parameters>
Dados da solicitação
Quando uma função é chamada, ela pode receber dados arbitrários (carga útil de solicitação) em texto ou formato binário. A presença de um valor Content-Type
no cabeçalho da solicitação HTTP determina a forma e a codificação dos
dados que são enviados à função. A estrutura de dados, o formato e o tipo de conteúdo devem corresponder. O serviço de funções Code Engine executa uma verificação de validação mínima nos dados, considerando o tipo de conteúdo, e responde
com o código de status HTTP 400
em determinados casos; por exemplo, se o formato ou a codificação dos dados JSON for inválido.
Para todos os outros valores ' Content-Type
selecionados, espera-se que o formato de dados corresponda às restrições do tipo MIME.
Fornecimento de dados de solicitação como parâmetros de consulta
Os dados da solicitação podem ser fornecidos como pares de valores-chave no formato codificado em URL (também chamado de codificado por porcentagem) no site HTTP URL.
A porcentagem de codificação é amplamente utilizada na tecnologia da Web Todos os caracteres de 8 bits são escritos como valores hexadecimais precedidos por um sinal de porcentagem (%). Esse tipo de codificação também é conhecido como URL-encoding.
Exemplo de invocação de uma função usando parâmetros de consulta:
curl -v "https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud/?planet1=Mars&planet2=Jupiter"
Fornecimento de dados de solicitação no corpo da solicitação
Os dados da solicitação são fornecidos na seção body da solicitação HTTP. O formato dos dados deve corresponder ao valor ' Content-Type
fornecido.
Exemplos de invocação de uma função usando dados do corpo no 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
Exemplo de invocação de uma função usando dados do corpo no 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 o valor ' Content-Type
estiver ausente em uma solicitação, Code Engine tratará a carga de dados conforme descrito para ' application/json
.
Fornecimento de dados de cabeçalho de solicitação
Os dados da solicitação são fornecidos em pares de valores-chave na seção de cabeçalho da solicitação HTTP.
Exemplo de invocação de uma função usando campos de cabeçalho:
curl -v -H "Sample_Data: Sample_Value" https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud
Fornecimento de dados mistos de solicitação
Code Engine suportam o uso de diferentes maneiras de fornecer dados de solicitação em uma única solicitação HTTP.
Exemplo de invocação de uma função usando dados do corpo e campos de cabeçalho:
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
Exemplo de invocação de uma função usando dados do corpo, cabeçalhos e 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
Interface de dados de solicitação interna
A interface de dados de solicitação interna descreve como o serviço de funções Code Engine fornece dados de solicitação recebidos na interface de dados externa para o código de função. Independentemente da linguagem de codificação, você pode implementar a lógica da função para colocar todos os parâmetros da solicitação na função main() como o primeiro parâmetro.
Você pode usar qualquer nome para esse parâmetro; nos exemplos a seguir, o parâmetro é chamado de ' args
.
Além disso, o código da função recebe um conjunto de variáveis de ambiente predefinidas injetadas automaticamente.
Exemplo do 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 exemplo:
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;
O serviço de funções Code Engine usa codificações diferentes para os dados de entrada para ajudar a garantir que o código da função possa acessar os dados de entrada no argumento ' args
. As codificações ajudam a garantir que dados
estruturados, texto simples, dados e dados binários possam fazer parte dos dados de entrada.
Codificação de texto
A codificação de texto é usada para elementos no parâmetro de entrada ' args
que contém carga útil de texto. A codificação é necessária para ajudar a garantir que os caracteres especiais sejam escapados e não danifiquem a estrutura
de dados do parâmetro ' args
.
Code Engine executa a codificação do conteúdo do texto antes de chamar a função main(). A lógica de programa da função pode precisar de um unescape para recriar os dados originais.
Caracteres de escape suportados:
- O backspace é substituído por
\b
- O feed de formulário é substituído por
\f
- A nova linha é substituída por
\n
- O retorno de linha é substituído por
\r
- A guia é substituída por
\t
- As aspas duplas são substituídas por
\"
- A barra invertida é substituída por
\\
.
codificação Base64
A codificação Base64 é usada para elementos no parâmetro de entrada ' args
que podem quebrar a estrutura de dados interna do parâmetro ' args
. Codificá-lo como Base64 ajuda a garantir que o valor inteiro consista
apenas em caracteres legíveis em um alfabeto de 64 caracteres.
Por exemplo:
"eyAicGxhbmV0MSI6Ik1hcnMiLCAicGxhbmV0MiI6Ikp1cGl0ZXIiIH0="
Codificação de porcentagem ( URL-encoding)
A porcentagem de codificação é amplamente utilizada na tecnologia da Web Todos os caracteres de 8 bits são escritos como valores hexadecimais precedidos por um sinal de porcentagem (%). Esse tipo de codificação também é conhecido como URL-encoding.
A função recebe os dados do tipo ' form-urlencoded
em formato bruto no parâmetro ' __ce_body
.
O serviço de funções Code Engine passa os parâmetros de consulta como estão (o ' ?
inicial não faz parte deles) para o campo ' __ce_query
do parâmetro ' args
. Dessa forma, o código de função recebe
esse parâmetro no formato codificado em URL; por exemplo:
"x%5cb=1%22f4%20and%20"
O parâmetro ' args
O parâmetro " args
é uma estrutura de dados específica da linguagem (objeto JSON para Node.js e tipo " dict
(dicionário) para Python) preenchida com os dados de entrada da solicitação no seguinte formato:
Elementos de nível superior | Descrição |
---|---|
__ce_<service_variable> |
Code Engine argumento de entrada interna do serviço. |
__ce_headers |
Uma cópia do elemento de cabeçalho da solicitação HTTP. |
<property> (opcional) |
Propriedades de nível superior disponíveis se os dados de entrada da solicitação HTTP forem fornecidos em formato estruturado (somente se for usado um tipo de conteúdo application/json ). |
{: caption="Elementos para o 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"
}
}
conjunto de parâmetros args
para argumentos de entrada internos (__ce_*
)
O serviço de funções Code Engine injeta argumentos de entrada reservados nos dados de entrada ' args
.
Os seguintes parâmetros podem aparecer no argumento ' args
, dependendo de como o chamador fornece os dados da solicitação:
Nome do parâmetro | Tipo de valor | Descrição |
---|---|---|
__ce_method |
Sequência | O método de solicitação HTTP (uma solicitação GET ou POST). |
__ce_headers |
Mapa de pares de valores-chave | Pares de valores-chave do cabeçalho da solicitação HTTP. |
__ce_path |
Sequência | URL caminho da solicitação de entrada HTTP. |
__ce_body |
Sequência | A entidade do corpo da solicitação, como uma sequência Base64-encoded quando o tipo do conteúdo da solicitação é binário ou como uma sequência simples; caso contrário, |
__ce_query |
Sequência | Os parâmetros de consulta da solicitação como uma sequência não analisada. O parâmetro __ce_query é uma única cadeia de caracteres que contém os parâmetros de consulta que são analisados a partir do URL, sem o ponto de
interrogação inicial (?) e separados por um E comercial (&). |
Os parâmetros internos do __ce_*
não podem ser substituídos por dados de solicitação fornecidos na solicitação HTTP. HTTP as chamadas que tentam substituir falham com o código de status 400
(Bad Request).
Conteúdo do parâmetro " args
se um chamador fornecer dados de solicitação por meio de parâmetros de consulta
Uma função recebe dados de parâmetros de consulta como pares de valores-chave no parâmetro __ce_query
e é codificada em porcentagem ( URL-encoded). Além disso, cada parâmetro de consulta individual é um par de valores-chave
no formato decodificado:
campo args |
Isso está definido? | Descrição |
---|---|---|
__ce_body |
Não | Corpo |
__ce_headers |
True | Cabeçalho sem tipo de conteúdo |
__ce_query |
True | Parâmetro da consulta ( URL-encoded) |
Propriedade de nível superior | True | Par chave-valor ( URL-decodificado e codificado por texto) |
Exemplo Python de acesso 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,
}
Exemplo de acesso a parâmetros de consulta 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;
Conteúdo do parâmetro " args
se um chamador fornecer dados de solicitação por meio de dados de cabeçalho
Uma função recebe dados de cabeçalho de solicitação como pares de valores chave no parâmetro ' __ce_headers
. O par chave-valor é convertido em um formato canônico, independentemente do formato em que a chave é definida na interface
de dados externos. Por exemplo, tanto o " mykey
quanto o " MYKEY
são convertidos em " Mykey
:
campo args |
Isso está definido? | Descrição |
---|---|---|
__ce_body |
Não | Corpo |
__ce_headers |
True | Cabeçalho em par chave-valor (codificado por texto) (a chave está em formato canônico). |
__ce_query |
"" | O parâmetro de consulta é uma string vazia. |
Propriedade de nível superior | Não |
Exemplo Python de acesso a dados de cabeçalho:
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,
}
Exemplo do Node.js de acesso a dados de cabeçalho:
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
dos dados da solicitação do tipo de conteúdo ' application/json
Uma função recebe as chaves e os valores do documento JSON como parâmetros de propriedade de nível superior dedicados.
Quando nenhum valor é definido para Content-type
na solicitação HTTP, a função Code Engine usa application/json
como padrão.
Além disso, a carga útil JSON é disponibilizada para a função como está (como matriz de bytes) no formato Base64-encoded no parâmetro ' __ce_body
.
campo args |
Isso está definido? | Descrição |
---|---|---|
__ce_body |
True | Dados da solicitaçãoBase64-encoded) |
__ce_headers |
True | O tipo de conteúdo está definido |
__ce_query |
"" | Sequência de caracteres vazia |
Propriedade de nível superior | True | Par chave-valor para cada elemento de nível superior (codificado em texto) |
Exemplo Python de acesso aos dados 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,
}
Exemplo do Node.js de acesso aos dados 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
dos dados da solicitação do tipo de conteúdo ' application/octet-stream
Uma função recebe dados binários no formato Base64-encoded para os dados binários ' __ce_body
no parâmetro ' __ce_body
:
campo args |
Isso está definido? | Descrição |
---|---|---|
__ce_body |
True | Dados da solicitaçãoBase64-encoded) |
__ce_headers |
True | O tipo de conteúdo está definido |
__ce_query |
"" | Sequência de caracteres vazia |
Propriedade de nível superior | Não |
Exemplo Python de acesso aos dados 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,
}
Exemplo do Node.js de acesso aos dados 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
dos dados da solicitação do tipo de conteúdo ' text/plain
Uma função recebe dados do tipo texto no formato Base64-encoded no parâmetro ' __ce_body
:
campo args |
Isso está definido? | Descrição |
---|---|---|
__ce_body |
True | Dados da solicitação (codificados em texto) |
__ce_headers |
True | O tipo de conteúdo está definido |
__ce_query |
"" | Sequência de caracteres vazia |
Propriedade de nível superior | Não |
A lógica de programa da função pode precisar de um unescape para recriar os dados originais.
Exemplo Python de acesso aos dados 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,
}
Exemplo do Node.js de acesso aos dados 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
dos dados da solicitação do tipo de conteúdo ' application/x-www-form-urlencoded
Uma função recebe os dados completos do corpo em formato codificado por texto no parâmetro ' __ce_body
:
campo args |
Isso está definido? | Descrição |
---|---|---|
__ce_body |
True | Dados da solicitação (codificados em texto) |
__ce_headers |
True | O tipo de conteúdo está definido |
__ce_query |
"" | Sequência de caracteres vazia |
Propriedade de nível superior | Não |
Exemplo Python de acesso aos dados 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,
}
Exemplo do Node.js de acesso aos dados 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
dos dados da solicitação do tipo de conteúdo ' application/x-www-form-urlencoded
e parâmetros de consulta
Todas as combinações de tipos de dados mistos são possíveis, mas considere que, para solicitações HTTP com parâmetros de consulta URL e parâmetros de corpo, os parâmetros de corpo têm precedência sobre os parâmetros de consulta.
Variáveis de ambiente da função Code Engine
Embora os parâmetros de chamada de função sejam derivados da solicitação de entrada HTTP, uma função Code Engine também tem acesso a um conjunto de variáveis de ambiente predefinidas derivadas das configurações do sistema:
- CE_ALLOW_CONCURRENT
- CE_API_BASE_URL
- CE_DOMAIN
- CE_EXECUTION_ENV
- CE_FUNÇÃO
- CE_PROJECT_ID
- CE_REGIÃO
- CE_SUBDOMAIN
Para obter mais informações sobre essas variáveis de ambientes, consulte Variáveis de ambiente injetadas automaticamente.
Exemplo Python de acesso a variáveis de ambiente:
import os
def main(args):
curEnv=dict(os.environ)
return {
"headers": { "Content-Type": "application/json" },
"statusCode": 200,
"body": {
"env": curEnv,
}
}
Exemplo do Node.js de acesso a variáveis de ambiente:
function main(args) {
var curEnv = process.env; //read the function's env vars
return {
"headers": { "Content-Type": "application/json" },
"statusCode": 200,
"body": {
"env": curEnv,
}
};
}
module.exports.main = main;
Interface de dados de resposta interna
A interface interna de dados de resposta descreve como o código de função fornece dados de resposta. O serviço de funções Code Engine processa os dados e fornece uma resposta HTTP ao chamador.
Independentemente da linguagem de programação, o código da função deve fornecer os dados de resposta como estrutura de dados na instrução de retorno.
Dependendo da linguagem de programação, o objeto de resultado é um objeto JSON (linguagemNode.js ) ou um dicionário (linguagemPython ) com a seguinte estrutura:
Funções Dados de resultados | Requisito | Descrição |
---|---|---|
headers |
Opcional | Um objeto de resultado no qual as chaves são nomes de cabeçalho e os valores são cadeias de caracteres, números ou valores booleanos. Para enviar vários valores para um único cabeçalho, o valor do cabeçalho é uma matriz dos vários valores. Os cabeçalhos não são configurados por padrão. |
statusCode |
Deve (padrão 200) | Um código de status HTTP válido. |
body |
Opcional (padrão: vazio) | Uma cadeia de caracteres que é texto simples, um objeto ou matriz JSON ou uma cadeia Base64-encoded para dados binários. O corpo é considerado vazio se for nulo, uma cadeia de caracteres vazia ("") ou indefinido. |
Exemplo de estrutura de dados de resultado para fornecer dados de resultado da execução da função:
import os
def main(args):
return {
headers: {
"content_type" : "application/json" ,
"key" , "value"
},
"statusCode": 200,
body: {"myMessage" : "sample message"}
}
Sempre defina ' body
e ' statusCode
. A configuração implícita de ' statusCode
e body está disponível apenas para compatibilidade com as funções obsoletas Code Engine.
headers
elemento
A principal intenção da seção de cabeçalhos é definir o tipo de conteúdo no qual a função fornecerá os dados de resposta. Os dados do resultado suportam o valor " MIME-Type
idêntico ao aceito na solicitação.
Dependendo do valor do ' Content-Type
, o campo do corpo na estrutura do resultado deve conter os seguintes aspectos:
Tipo de conteúdo | Valor que é atribuído ao elemento body | Exemplo |
---|---|---|
application/json |
Objeto JSON | body : { key_1: val1 } |
Não definido (padrão) | Sequência | body : "some text" |
text/* |
Sequência | body : "some text" |
audio/* , example/* , font/' , image/* , video/* , and all remaining types |
Base64-encoded | body: "SGVsbG8gV29ybGQhCg==" |
Além disso, o código de função pode usar pares de valores-chave no cabeçalho de resposta HTTP para fornecer dados de resposta. Portanto, o código deve colocar um nome de chave exclusivo e seu valor na seção de cabeçalhos da estrutura de dados que é usada na instrução de retorno.
Observe estas considerações importantes sobre o nome:
- Os nomes das chaves não diferenciam maiúsculas de minúsculas
- É usada a atribuição de valor mais recente de nomes de chave idênticos
- Não há suporte para barras invertidas ou espaços em branco
Observe essas considerações de valor:
- Os valores devem ser codificados por texto
- Os valores devem ser do tipo de dados string ou matriz de string
Exemplo de retorno de dados de resposta como um par de valores-chave de cabeçalho:
import os
def main(args):
return {
"headers": {
"Content-Type": "text/plain",
"key_1" : "sample_value",
},
"statusCode": 200,
"body": "" ,
}
statusCode
elemento
O código das funções deve definir explicitamente um código de status (padrão ' 200
) para informar o chamador sobre o resultado da execução. Você pode usar qualquer código de status de retorno HTTP válido (ou seja, código de status
200
a 599
).
O serviço de funções Code Engine retorna o código de status da função no campo de cabeçalho (x-faas-actionstatus
) e como um código de status HTTP.
Se o statusCode
for inválido, o serviço de funções Code Engine retornará o código de retorno HTTP 422
(Invalid function code cannot be processed) sem o campo de cabeçalho x-faas-actionstatus
e sem dados
de resposta adicionais.
Se o limite de tamanho do resultado para as funções for atingido, um código de status HTTP de 400
será retornado ao cliente.
Exemplo de retorno do código de status da resposta:
import os
def main(args):
return {
"statusCode": 200,
"body": "" ,
}
body
elemento
O código da função pode incluir a seção ' body
da estrutura de dados de retorno para fornecer os dados de resposta da função. O código de função é responsável por fornecer o elemento " body
na estrutura de dados
de retorno no formato correspondente ao " Content-Type
. Se a resposta da função ' Content-Type
estiver ausente, o código da função retornará ' Content-Type: text/plain; charset=utf-8
na interface
externa e os dados do campo ' body
em sua forma inalterada.
Considere as seguintes regras de corpo, dependendo do tipo de conteúdo usado.
Valor do corpo do tipo de conteúdo ' application/json
O código da função deve fornecer o valor do elemento ' body
como uma estrutura de dados válidaNodeJs-JSON ou Python). As chaves e os valores da estrutura de dados devem seguir as regras de sintaxe JSON para que o serviço Code
Engine possa fornecer os dados de resposta na seção de dados de resposta application/json
HTTP.
As barras invertidas (\
) e as aspas duplas ("
) na estrutura de dados são entregues em formato de texto codificado na seção de dados de resposta HTTP.
Exemplo Python de uma resposta " 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,
}
Exemplo do Node.js de uma resposta " 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 do corpo do tipo de conteúdo ' application/octet-stream
Os dados de resultado do código de função devem ser Base64-encoded antes de serem adicionados à estrutura de resultados.
Exemplo Python de uma resposta " 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,
}
Exemplo do Node.js de uma resposta " 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 do corpo do tipo de conteúdo ' text/plain
O código da função deve fornecer a resposta completa em uma única cadeia de caracteres. O serviço de funções Code Engine não verifica os dados de resposta; os dados são transferidos para o chamador conforme fornecido.
Exemplo Python de uma resposta " text/plain
:
def main(args):
result_body = "myfolder_myFile"
return {
"headers": {
"Content-Type": "text/plain;charset=utf-8",
},
"statusCode": 200,
"body": result_body,
}
Valor do corpo do tipo de conteúdo ' application/x-www-form-urlencoded
(conteúdo codificado por porcentagem)
O código da função deve ajudar a garantir que os dados da resposta sejam codificados em URL antes de serem adicionados à estrutura de dados do resultado. O serviço de funções Code Engine não verifica se a sintaxe dos dados de resposta está correta. Os dados são transferidos para o autor da chamada conforme fornecido.
Exemplo Python de uma resposta " application/x-www-form-urlencoded
:
import os
def main(args):
result_body = "myfolder%20myFile"
return {
"headers": {
"Content-Type": "application/x-www-form-urlencoded",
},
"statusCode": 200,
"body": result_body,
}
Interface de dados de resposta externa
A definição da interface de dados externos é derivada do site padronizado HTTP. Os tipos MIME no cabeçalho HTTP Response são usados para definir o formato da resposta HTTP.
Tipos Mime
Quando Code Engine retorna dados para o mundo externo, as funções Code Engine podem suportar os mesmos tipos de MIME da IANA descritos em Tipos de MIME.
Dados de resposta
A interface de dados externos retorna a estrutura de dados de resposta como cabeçalho HTTP, código de status HTTP e dados de resposta HTTP para o chamador da função.
HTTP campos de cabeçalho
O cabeçalho HTTP contém todos os pares de valores-chave que o código de função adicionou à estrutura de dados do resultado.
O serviço de funções Code Engine adiciona os seguintes pares de valores-chave:
Nome do campo | Descrição |
---|---|
x-request-id |
A ID da solicitação externa para a função invocada. |
x-faas-activation-id |
A ID interna do serviço de funções Code Engine para a invocação. |
x-faas-actionstatus |
O código de status do código de função definido. |
Os nomes das chaves de cabeçalho são sempre respondidos em letras minúsculas.
Código de status HTTP
A origem do código de status HTTP pode ser o próprio serviço de funções Code Engine ou o código de status definido pelo código de função. A presença do campo de cabeçalho " x-faas-statuscode
é o indicador da origem.
O significado do código de status HTTP pode ser lido na documentação das funções Code Engine se o campo de cabeçalho x-faas-actionstatus
não estiver definido. No entanto, se o campo de cabeçalho for definido, a lógica da função
definirá o significado do código de status HTTP.
Code Engine o serviço de funções executa uma verificação de validade limitada nos dados de resposta e no tipo de conteúdo e retorna um código de status HTTP de 400
se o formato ou a codificação dos dados (gerados pelo código
de função) for inválido.
HTTP dados de resposta
Os dados de resposta do site HTTP na interface de dados externa são idênticos aos fornecidos na estrutura de dados de resultado pelo código de função. Somente se o " MIME-Type
for " application/json
, a
chave e os valores na resposta JSON fornecida serão modificados. Todas as barras invertidas e aspas duplas são escapadas.
Por exemplo, o chamador recebe os dados de resposta " application/json
. O código de função que fornece os dados de resposta é o seguinte:
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,
}
O cliente ' curl
que usa a resposta ' statusCcode
, os campos ' header
e os dados da resposta é o seguinte:
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
exemplos de invocação da função Code Engine
Siga estas etapas para ver a criação de uma função Code Engine com a CLI e o uso da interface de dados externos:
-
Salve o código a seguir como
hello.js
localmente:function main(args) { return { headers: { content_type: "application/json" }, statusCode: 200, body: {args: args} }; }
-
Depois de fazer logon no IBM Cloud® e selecionar o serviço de funções Code Engine, crie uma nova função:
ibmcloud ce fn create --name sample --runtime nodejs-20 --inline-code sample.js --cpu 0.5 --memory 2G
Saída de exemplo:
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 ...
-
Use a interface de dados externos com um comando '
curl
para chamar a função:curl -v https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud/
Saída de exemplo:
{ "args": { "__ce_headers": { "Accept": "*/*", "User-Agent": "curl/7.58.0", "X-Request-Id": "813804ec-ef14-42e9-bce3-c162373defae" }, "__ce_method": "GET", "__ce_path": "/" } }
-
Invoque a função usando parâmetros de consulta:
curl -v "https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud/?planet1=Mars&planet2=Jupiter"
Saída de exemplo:
{ "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" } }
O parâmetro de consulta está disponível desdobrado nos argumentos e também não modificado em '
__ce_query
. -
Invoque a função usando os dados do formulário:
curl -H "Content-Type: application/x-www-form-urlencoded" -d 'planet1=Mars&planet2=Jupiter' https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud
Saída de exemplo:
{ "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": "/" } }
O conteúdo do corpo da solicitação está disponível inalterado no argumento "
__ce_body
com caracteres reservados do JSON que estão sendo escapados. -
Invoque a função usando um objeto de dados JSON:
curl -H "Content-Type: application/json" -d '{"planet1": "Mars", "planet2": "Jupiter"}' https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud
Saída de exemplo:
{ "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" } }
O conteúdo do corpo da solicitação está disponível desdobrado nos argumentos da função (
args
) com caracteres reservados JSON que estão sendo escapados e também não modificados como uma cadeia de caracteres ' Base64-encoded em '__ce_body
. -
Invoque a função usando dados JSON e 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"
Saída de exemplo:
{ "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" } }
Os parâmetros do corpo e os parâmetros de consulta são desdobrados nos argumentos da função (
args
). Os parâmetros do corpo substituem os parâmetros de consulta. O corpo da solicitação está disponível em '__ce_body
(Base64-encoded). Os parâmetros de consulta estão disponíveis em '__ce_query
. -
Chame a função usando o tipo de conteúdo de 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
Saída de exemplo:
{ "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": "/" } }
O conteúdo do corpo da solicitação está disponível sem modificações em '
__ce_body
, mas com caracteres especiais JSON escapados com '\\
ou '\
. -
Chame a função usando o tipo de conteúdo binário:
curl -H "Content-Type: application/octet-stream" -d 'This string is treaded as binary data.' https://sample.1kweru2e873.eu-gb.codeengine.appdomain.cloud
Saída de exemplo:
{ "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": "/" } }