IBM Cloud Docs
使用函数交换数据

使用函数交换数据

调用 Code Engine 函数服务(或简单函数)是通过客户端的 HTTP 请求完成的。 可以通过以下方式向函数传递信息:

  • 作为 URL (路径和可选查询参数)的一部分
  • 通过 HTTP 请求头
  • 通过 HTTP 请求正文

呼叫者在客户端收到这些值时,会收到一封 HTTP 回复。 响应数据传递如下

  • HTTP 回复代码
  • 通过 HTTP 回复标题
  • 通过 HTTP 回复正文

通过 HTTP 请求调用函数的所有规则和功能以及由此产生的 HTTP 响应都是_外部数据接口_。

收到的 HTTP 请求将转发至功能代码,以便根据_内部请求数据接口_的规则进行处理。 功能代码提供的结果必须遵循_内部响应数据接口_的规则。

下图显示了使用外部数据接口的客户端的信息流。 该流程使用Code Engine功能服务和内部请求数据接口来获取功能代码。 同样,由此产生的数据也会通过Code Engine函数服务从函数代码流向内部响应数据接口,并从外部数据接口流回调用者。

![函数接口。](images/ce_functions_interfaces.svg "功能接口 "")

外部请求数据接口

外部数据接口定义源自标准化 HTTP。

MIME 类型

MIME类型用于定义 HTTP 请求信息和 HTTP 响应的格式。

以下 IANA MIME 类型支持 HTTP 请求或 HTTP 响应的内容类型(Content-Type )。 支持 MIME 类型参数,但不包括在此列表中:

  • JSON 类型:
    • application/json; <parameters>
  • 二进制类型:
    • audio/*; <parameters>
    • application/octet-stream; <parameters>
    • example/*; <parameters>
    • font/*; <parameters>
    • image/*; <parameters>
    • model/*; <parameters>
    • multipart/*; <parameters>
    • video/*; <parameters>
  • 文本类型:
    • text/plain; <parameters>
    • text/html; <parameters>
    • text/*; <parameters>
  • 百分比编码类型:
    • application/x-www-form-urlencoded; <parameters>

请求数据

调用函数时,它可以接收文本或二进制格式的任意数据 (请求有效内容)。 HTTP 请求头中存在 Content-Type 值,决定了发送到函数的数据的格式和编码。 数据结构、格式和内容类型必须匹配。 Code Engine 函数服务通过考虑内容类型对数据进行最低限度的验证检查,并在某些情况下(例如JSON数据格式或编码无效)以 HTTP 状态代码 400 进行响应。

对于所有其他选定的 "Content-Type 值,数据格式应符合 MIME 类型的限制。

将请求数据作为查询参数提供

请求数据可以 URL 编码格式(也称为百分比编码)的键值对形式在 HTTP URL 中提供。

百分比编码广泛用于 Web 技术。 所有8位字符都以十六进制值的形式书写,前面带有百分号(%)。这种编码方式也被称为 URL 编码。

使用查询参数调用函数的示例:

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

在请求正文中提供请求数据

请求数据在 HTTP 请求的正文部分提供。 数据格式必须与提供的 "Content-Type 值一致。

在 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

在 Windows™ 中使用主体数据调用函数的示例:

curl -v  -H "Content-Type: application/json" -d "{\"key_1\":\"Mars\",\"planet2\":\"Jupiter\"}"  "https://function-nodejs-95.1057yuwab63w.us-east.codeengine.appdomain.cloud"

如果请求中缺少“Content-Type 值,Code Engine将按照”application/json 的描述处理数据有效载荷。

提供请求头数据

请求数据以键值对的形式出现在 HTTP 请求的标头部分。

使用标题字段调用函数的示例:

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

提供混合数据请求

Code Engine 功能支持在单个 请求中使用不同的方式提供请求数据。HTTP

使用正文数据和标题字段调用函数的示例:

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

使用主体数据、标题和查询参数调用函数的示例:

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

内部请求数据接口

内部请求数据接口描述了Code Engine功能服务如何将外部数据接口接收到的请求数据传递给功能代码。 与编码语言无关,您可以实现函数逻辑,将所有请求参数作为第一个参数放入 main() 函数中。

您可以为该参数使用任何名称;在下面的示例中,该参数被称为 "args

此外,函数代码还会收到一组自动注入的预定义环境变量。

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 例如:

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;

Code Engine函数服务对输入数据使用不同的编码,以帮助确保函数代码能够访问 "args 参数中的输入数据。 编码有助于确保结构化数据、纯文本、数据和二进制数据都能成为输入数据的一部分。

文本编码

文本编码用于输入 "args 参数中包含文本有效载荷的元素。 编码是必要的,有助于确保特殊字符被转义,并且不会损坏 "args 参数的数据结构。

Code Engine在调用 main() 函数前运行文本内容编码。 函数的程序逻辑可能需要将其解码,以重新创建原始数据。

支持的转义字符:

  • 退格将替换为 \b
  • 换页将替换为 \f
  • 换行符将替换为 \n
  • 回车符将替换为 \r
  • 选项卡将替换为 \t
  • 双引号将替换为 \"
  • 反斜杠替换为 \\

Base64 编码

Base64编码用于处理输入“args 参数中可能破坏”args 参数内部数据结构的元素。 将其编码为Base64有助于确保整个值仅由 64 个字符字母表中的可读字符组成。

例如:

"eyAicGxhbmV0MSI6Ik1hcnMiLCAicGxhbmV0MiI6Ikp1cGl0ZXIiIH0="

百分比编码( URL 编码)

百分比编码广泛用于 Web 技术。 所有8位字符都以十六进制值的形式书写,前面带有百分号(%)。这种编码方式也称为 URL 编码。 The function receives the form-urlencoded type data in raw format in the __ce_body parameter.

Code Engine函数服务会将查询参数原样(前导 "? 不在其中)传入 "args 参数的 "__ce_query 字段。 这样,函数代码将以 URL 编码格式接收此参数;例如:

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

args 参数

args 参数是一种特定语言的数据结构(Node.js为 JSON 对象,Python 为 "dict(字典)类型),按以下格式填充请求输入数据:

顶级元素 描述
__ce_<service_variable> Code Engine服务内部输入参数。
__ce_headers HTTP 请求头元素的一个副本。
<property>(可选) 如果 HTTP 请求输入数据以结构化格式提供(仅当使用 application/json 的内容类型时),则可以使用顶级属性。
{: caption="'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"
      }
  }

args parameter set for internal input arguments (__ce_*)

Code Engine功能服务会向 "args 输入数据注入保留的输入参数。

以下参数可以出现在 "args 参数中,具体取决于调用者如何提供请求数据:

Code Engine函数输入参数的参数
参数名称 值类型 描述
__ce_method 字符串 HTTP 请求方法(GET或POST请求)。
__ce_headers 键值对映射 HTTP 请求标头的键值对。
__ce_path 字符串 URL 传入的 请求路径。HTTP
__ce_body 字符串 请求内容类型为二进制时作为 Base64-encoded 字符串的请求主体实体,或者作为纯字符串的请求主体实体,否则作为纯字符串的请求主体实体。
__ce_query 字符串 请求中的查询参数(以未解析字符串的形式提供)。 __ce_query 参数是一个包含查询参数的字符串,这些参数是从 URL 解析出来的,不带前导问号(?),用符号(&)分隔。

HTTP 请求中提供的请求数据无法覆盖内部 __ce_* 参数。 HTTP 尝试覆盖的调用失败,状态码为 (错误请求)。400

如果调用者通过查询参数提供请求数据,"args 参数的内容

函数接收查询参数数据,以键值对的形式保存在 __ce_query 参数中,并使用百分比编码( URL 编码)。 此外,在解码格式中,每个查询参数都是一个键值对:

调用函数时从查询参数中获取 args 参数
args 字段 这一切都准备好了吗? 描述
__ce_body 正文
__ce_headers 无内容类型的标题
__ce_query 查询参数( URL 编码)
顶层属性 键值对( URL ——解码和文本编码)

访问查询参数的Python示例:

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

访问查询参数的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;

如果调用者通过标头数据提供请求数据,"args 参数的内容

函数在 "__ce_headers 参数中接收键值对形式的请求头数据。 无论键值对在外部数据接口上设置的是哪种格式,键值对都会被转换成规范格式。 例如,"mykey 或 "MYKEY 都会转换为 "Mykey

调用函数时,从头参数中获取 args 参数
args 字段 这一切都准备好了吗? 描述
__ce_body 正文
__ce_headers 以键值对(文本编码)表示的标题(键为规范格式)。
__ce_query "" 查询参数为空字符串。
顶层属性

访问标题数据的Python示例

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

访问标题数据的Node.js示例

function main(args) {
  // var header_parm_1 = args.__ce_headers.Key_1  //get the value of one header parameter
  var header = args.__ce_headers  // get all header parameters

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

module.exports.main = main;

args parameter from request data of content-type application/json

函数接收 JSON 文档的键和值,作为专用的顶级属性参数。

当在 HTTP 请求中未为 Content-type 设置值时,Code Engine 函数将使用 application/json 作为默认值。

此外,JSON 有效载荷将以Base64-encoded格式(字节数组)提供给 "__ce_body 参数中的函数。

调用函数时从查询参数中获取 args 参数
args 字段 这一切都准备好了吗? 描述
__ce_body 请求数据Base64-encoded
__ce_headers 内容类型已设置
__ce_query "" 空字符串
顶层属性 每个顶层元素的键值对(文本编码)

访问 "application/json 输入数据的Python示例

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

访问 "application/json 输入数据的Node.js示例

function main(args) {
  var body  = args.__ce_body  // get complete request body (base64 encoded)
  var value_1 = args.key_1    // get value of one single key

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

module.exports.main = main;

args parameter from request data of content-type application/octet-stream

函数接收Base64-encoded格式的二进制数据,用于“__ce_body 参数中的”__ce_body 二进制数据:

请求数据中的 args 参数
args 字段 这一切都准备好了吗? 描述
__ce_body 请求数据Base64-encoded
__ce_headers 内容类型已设置
__ce_query "" 空字符串
顶层属性

访问 "application/octet-stream 输入数据的Python示例

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

访问 "application/octet-stream 输入数据的Node.js示例

function main(args) {
  var base64EncodedBody = args.__ce_body   // get complete request body (base64 encoded)
  var body = Buffer.from(args.__ce_body, 'base64').toString('utf-8') //  read binary data into the body variable

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

module.exports.main = main;

args parameter from request data of content-type text/plain

函数接收 "__ce_body 参数中Base64-encoded格式的文本类型数据:

请求数据中的 args 参数
args 字段 这一切都准备好了吗? 描述
__ce_body 请求数据(文本编码)
__ce_headers 内容类型已设置
__ce_query "" 空字符串
顶层属性

函数的程序逻辑可能需要将其解码,以重新创建原始数据。

访问 "text/plain 输入数据的Python示例

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

访问 "text/plain 输入数据的Node.js示例

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

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

module.exports.main = main;

args parameter from request data of content-type application/x-www-form-urlencoded

函数在参数 "__ce_body 中接收文本编码格式的完整正文数据:

请求数据中的 args 参数
args 字段 这一切都准备好了吗? 描述
__ce_body 请求数据(文本编码)
__ce_headers 内容类型已设置
__ce_query "" 空字符串
顶层属性

访问 "application/x-www-form-urlencoded 输入数据的Python示例

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

访问 "application/x-www-form-urlencoded 输入数据的Node.js示例

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

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

module.exports.main = main;

args parameter from request data of content-type application/x-www-form-urlencoded and query parameters

所有混合数据类型的组合都是可能的,但请注意,对于带有 URL 查询参数和正文参数的 HTTP 请求,正文参数优先于查询参数。

Code Engine 函数环境变量

函数调用参数来自传入的 HTTP 请求,而 Code Engine 函数还可以访问一组来自系统设置的预定义环境变量:

  • ce_allow_concurrent
  • ce_api_base_url
  • CE_DOMAIN
  • ce_execution_env
  • CE_FUNCTION
  • CE_PROJECT_ID
  • CE_REGION
  • CE_SUBDOMAIN

有关这些环境变量的更多信息,请参阅 自动注入环境变量

访问环境变量的Python示例

import os

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

访问环境变量的Node.js示例

function main(args) {
  var curEnv = process.env; //read the function's env vars

  return {
    "headers": { "Content-Type": "application/json" },
    "statusCode": 200,
    "body": {
      "env": curEnv,
    }
  };
}

module.exports.main = main;

内部响应数据接口

内部响应数据接口描述了功能代码如何提供响应数据。 Code Engine 功能服务处理数据,并向呼叫者提供 HTTP 回复。

与编程语言无关,函数代码必须在返回语句中提供作为数据结构的响应数据。

根据编程语言的不同,结果对象要么是一个 JSON 对象Node.js语言),要么是一个字典Python语言),结构如下:

以 JSON 对象(Node.js语言)或字典(Python语言)表示的结果对象结构
函数结果数据 要求 描述
headers 可选 一个结果对象,其中键是标题名称,值是字符串、数字或布尔值。 若要为单个标题发送多个值,则标题的值是多个值的数组。 缺省情况下,不会设置任何头。
statusCode 应(默认 200) 有效的 HTTP 状态码。
body 可选(默认为空) 字符串可以是纯文本、JSON对象或数组,也可以是用于二进制数据的 Base64-encoded 字符串。 如果一个变量为空、空字符串("")或未定义,则视为空。

结果数据结构示例,用于提供函数执行结果数据:

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

始终设置 "body 和 "statusCode"。 隐式设置 "statusCode 和正文只是为了与已废弃的Code Engine函数兼容。

headers 元素

标头部分的主要目的是定义内容类型,函数将以该类型提供响应数据。 结果数据支持与请求时接受的相同 "MIME-Type 值。

根据 "Content-Type 值的不同,结果结构中的主体字段必须包含以下内容:

正文字段结果结构
内容类型 分配给正文元素的值 示例
application/json JSON 对象 body : { key_1: val1 }
未设置(默认) 字符串 body : "some text"
text/* 字符串 body : "some text"
audio/*, example/*, font/', image/*, video/*, and all remaining types Base64-encoded body: "SGVsbG8gV29ybGQhCg=="

函数代码也可以在 HTTP 响应头中使用键值对来提供响应数据。 因此,代码必须在返回语句中使用的数据结构的标头部分输入唯一的键名及其值。

请注意这些关键的名称注意事项:

  • 键名不区分大小写
  • 使用相同键名的最新值赋值
  • 不支持反斜线或空格

注意这些价值考虑因素:

  • 值必须是文本编码
  • 值的数据类型必须是字符串或字符串数组

将响应数据作为标头键值对返回的示例:

import os
def main(args):

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

statusCode 元素

函数代码必须明确设置状态代码(默认为 "200),以告知调用者执行结果。 您可以使用任何有效的 HTTP 返回状态代码(即状态代码 200599 )。

Code Engine 函数服务在报头字段(x-faas-actionstatus )中返回函数的状态代码,并以 HTTP 状态代码的形式返回。

如果 statusCode 无效,则 Code Engine 功能服务将返回 HTTP 返回代码 422 (无效的功能代码无法处理),且不包含 x-faas-actionstatus 报头字段和额外响应数据。

HTTP 如果函数的结果大小达到限制,则向客户端返回状态代码 400

返回响应状态代码示例:

import os
  def main(args):

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

body 元素

函数代码可包括返回数据结构的 "body 部分,以提供函数的响应数据。 函数代码负责将返回数据结构中的“body 元素以匹配格式传送给”Content-Type。 如果功能响应 "Content-Type 丢失,则功能代码会在外部接口返回 "Content-Type: text/plain; charset=utf-8,并以未更改的形式返回 "body 字段的数据。

根据所使用的内容类型,考虑以下正文规则。

内容类型 "application/json 的正文值

功能代码必须以有效数据结构NodeJs-JSON或Python)的形式提供 "body 元素的值。 数据结构的键和值必须遵循JSON语法规则,以便 Code Engine 服务能够在 application/json HTTP 响应数据部分中提供响应数据。

数据结构中的反斜杠(\ )和双引号(" )在 HTTP 响应数据部分以文本编码格式发送。

application/json 响应的Python示例:

  import os
  def main(args):
    # python dictionary
    result_body = { "key_1" : "myfolder\myFile" }

    return {
      "headers": {
        "Content-Type": "application/json",
      },
      "statusCode": 200,
      "body": result_body,
    }

Node.js示例 "application/json 响应:

function main(args) {
  // JSON data structure
  // Note: Backslash must be text encoded
  result_body =  { "key1" : "myfolder\\myFile"}

  return {
	  statusCode: 200,
	  headers: {
	    'Content-Type': "application/json",
	  },
	  "body" : result_body ,
  };
}
module.exports.main = main;

内容类型 "application/octet-stream 的正文值

在将函数代码的结果数据添加到结果结构之前,必须对其进行Base64-encoded。

application/octet-stream 响应的Python示例:

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

Node.js示例 "application/octet-stream 响应:

function main(args) {
  var result_body = "###\unreturned body###\n"
  var buff = new Buffer(result_body , 'utf8');

  return {
    statusCode: 200,
    headers: {
      'Content-Type': "application/octet-stream",
    },
    "body" : buff.toString('base64') ,
  };
}

module.exports.main = main;

内容类型 "text/plain 的正文值

功能代码必须以单个字符串提供整个响应。 Code Engine函数服务不会检查响应数据;数据会按提供的方式传输给调用者。

text/plain"响应的Python示例:

def main(args):
  result_body = "myfolder_myFile"

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

内容类型为 "application/x-www-form-urlencoded 的正文值(百分比编码内容)

函数代码必须确保响应数据在添加到结果数据结构之前经过 URL 编码。 Code Engine 功能服务不会检查响应数据的语法是否正确。 数据将按照规定传送给呼叫方。

application/x-www-form-urlencoded 响应的Python示例:

import os
def main(args):
  result_body = "myfolder%20myFile"

  return {
    "headers": {
    "Content-Type": "application/x-www-form-urlencoded",
    },
    "statusCode": 200,
    "body": result_body,
  }

外部响应数据接口

外部数据接口定义源自标准化 HTTP。 HTTP 响应头中的MIME类型用于定义 HTTP 响应的格式。

MIME 类型

当 "Code Engine向外部世界返回数据时,"Code Engine函数可以支持与 "MIME 类型 中描述的相同的 IANA MIME 类型。

响应数据

外部数据接口将响应数据结构作为 HTTP 报头、HTTP 状态代码和 HTTP 响应数据返回给函数的调用方。

HTTP 标题字段

HTTP 报头包含函数代码添加到结果数据结构中的所有键值对。

Code Engine功能服务会添加以下键值对:

Code Engine函数中的键值对
字段名称 描述
x-request-id 被调用函数的外部请求 ID。
x-faas-activation-id 用于调用的Code Engine功能服务内部 ID。
x-faas-actionstatus 状态代码设定的功能代码。

页眉键名一律用小写回复。

HTTP 状态码

HTTP 状态代码的来源可以是 Code Engine 功能服务本身,也可以是功能代码设置的状态代码。 标头字段 "x-faas-statuscode 的存在是原产地的标志。

如果未设置 x-faas-actionstatus 报头字段,可在 Code Engine 功能文档中查看 HTTP 状态代码的含义。 但是,如果设置了标题字段,则函数的逻辑将定义 HTTP 状态代码的含义。

Code Engine 函数服务会对响应数据和内容类型进行有限的有效性检查,如果数据格式或编码(由函数代码生成)无效,则返回 状态的 代码。400 HTTP

HTTP 响应数据

外部数据接口上的 HTTP 响应数据与函数代码在结果数据结构中提供的数据完全相同。 只有当“MIME-Type 为”application/json 时,才会修改所提供 JSON 响应中的键和值。 所有反斜线和双引号都被转义。

例如,调用者获得 "application/json 响应数据。 提供响应数据的功能代码如下:

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

使用响应 "statusCcode、"header 字段和响应数据的 "curl 客户端如下:

  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函数调用示例

请按照以下步骤查看如何使用 CLI 创建Code Engine函数以及外部数据接口的用法:

  1. 将以下代码保存为本地 hello.js

    function main(args) {
      return { headers: { content_type: "application/json" },
        statusCode: 200,
        body: {args: args}
      };
    }
    
  2. 登录IBM Cloud®并选择Code Engine函数服务后,创建一个新函数:

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

    示例输出:

    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. 使用外部数据接口和 "curl 命令调用函数:

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

    示例输出:

    {
        "args": {
            "__ce_headers": {
            "Accept": "*/*",
            "User-Agent": "curl/7.58.0",
            "X-Request-Id": "813804ec-ef14-42e9-bce3-c162373defae"
            },
            "__ce_method": "GET",
            "__ce_path": "/"
        }
    }
    
  4. 使用查询参数调用函数:

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

    示例输出:

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

    查询参数在参数中已展开,在 "__ce_query 中也未经修改。

  5. 使用表单数据调用函数:

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

    示例输出:

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

    在 "__ce_body 参数中,请求正文的内容未经修改,JSON 保留字符被转义。

  6. 使用 JSON 数据对象调用函数:

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

    示例输出:

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

    请求正文的内容会被展开成函数参数(args),其中的 JSON 保留字符会被转义,并在 "__ce_body 中以Base64-encoded字符串的形式保存。

  7. 使用 JSON 数据和查询参数调用函数:

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

    示例输出:

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

    正文参数和查询参数被展开为函数参数(args)。正文参数会覆盖查询参数。 请求正文以 "__ce_body(Base64-encoded)形式提供。 查询参数在 "__ce_query 中提供。

  8. 使用文本内容类型调用函数:

    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
    

    示例输出:

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

    请求正文的内容在 "__ce_body 中未经修改,但用 "\\ 或 "\ 转义了 JSON 特殊字符。

  9. 使用二进制内容类型调用函数:

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

    示例输出:

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