IBM Cloud Docs
Trocando dados com funções

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.

Interfaces de funções
Fluxo de informações para as funções Code Engine

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:

Parâmetros para os argumentos de entrada de uma função Code Engine
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:

parâmetro args dos parâmetros de consulta ao invocar funções
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:

parâmetro args dos parâmetros de cabeçalho ao invocar funções
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.

parâmetro args dos parâmetros de consulta ao invocar funções
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:

parâmetro args dos dados da solicitação
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:

parâmetro args dos dados da solicitação
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:

parâmetro args dos dados da solicitação
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:

Estrutura do objeto de resultado em um objeto JSON (linguagemNode.js ) ou em um dicionário (linguagemPython )
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:

Estrutura do resultado do campo do corpo
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:

Pares de valores-chave em funções Code Engine
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:

  1. Salve o código a seguir como hello.js localmente:

    function main(args) {
      return { headers: { content_type: "application/json" },
        statusCode: 200,
        body: {args: args}
      };
    }
    
  2. 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
    ...
    
  3. 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": "/"
        }
    }
    
  4. 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.

  5. 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.

  6. 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.

  7. 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.

  8. 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 ' \.

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