IBM Cloud Docs
與函數交換數據

與函數交換數據

Code Engine 函式服務(或簡單的函式)是透過 HTTP 請求在客戶端完成的。 訊息可以透過以下方式傳遞給函數:

  • 作為 URL 的一部分(路徑和可選的查詢參數)
  • 透過 HTTP 請求標頭
  • 透過 HTTP 請求正文

呼叫者會在用戶端收到這些值,作為 HTTP 的回應。 響應資料傳遞如下:

  • 如 HTTP 回應代碼
  • 透過 HTTP 回應標頭
  • 透過 HTTP 回應正文

所有透過 HTTP 請求調用函式的規則和能力,以及由此產生的 HTTP 回應,都是_外部資料介面_。

傳入的 HTTP 請求會使用_內部請求資料介面_的規則,轉送至功能代碼進行處理。 功能代碼提供的結果必須遵循_內部回應資料介面_的規則。

下圖顯示了來自使用外部資料介面的客戶端的資訊流。 此流程使用Code Engine函數服務和函數程式碼的內部請求資料介面。 同樣,結果資料透過Code Engine函數服務從函數代碼流向內部回應資料接口,外部資料接口流回呼叫者。

功能接口。
Code Engine函數
的資訊流

外部請求資料接口

外部資料介面定義源自標準化的 HTTP。

MIME 類型

MIME 類型用於定義 HTTP 請求資訊和 HTTP 回應的格式。

HTTP 請求或 HTTP 回應的 content-type (Content-Type) 支援下列 IANA MIME 類型。 支援 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 函式服務透過考慮內容類型對資料執行最低限度的驗證檢查,並在某些情況下回應 HTTP 狀態代碼 400 ;例如,如果 JSON 資料格式或編碼無效。

對於所有其他選定的 Content-Type 值,資料格式應符合 MIME 類型的限制。

提供請求資料作為查詢參數

請求資料可以 URL-encoded 格式 (也稱為 percent-encoded) 的 key-value 對提供,HTTP URL。

百分比編碼廣泛應用於網路技術。 所有 8 位元字元都寫成十六進位值,前面加上百分比符號 (%)。這種編碼方式也稱為 URL-encoding。

使用查詢參數呼叫函數的範例:

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-encoding)

百分比編碼廣泛應用於網路技術。 所有 8 位元字元都以十六進位值寫成,前面加上百分比符號 (%)。這種編碼方式也稱為 URL-encoding。 此函數在 __ce_body 參數中接收原始格式的 form-urlencoded 類型資料。

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 的 content-type 時)。
{: title=" 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 參數集( __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 解析出來的查詢參數,不含前導問號 (?),並以括號 (&) 隔開。

__ce_* 內部參數不能被 HTTP 請求中提供的請求資料覆蓋。 HTTP 嘗試覆寫的呼叫失敗,狀態代碼為 (Bad Request)。400

如果呼叫者透過查詢參數提供請求數據,則 args 參數的內容

函數以 __ce_query 參數中的關鍵值對接收查詢參數資料,並採用百分比編碼 ( URL-encoded)。 此外,每個查詢參數都是解碼格式中的鍵值對:

呼叫函數時查詢參數中的 args 參數
args 欄位 這是定的嗎? 說明
__ce_body 內文
__ce_headers True 沒有內容類型的標頭
__ce_query True 查詢參數 ( URL-encoded)
頂級物業 True 鍵值對( 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 參數中的鍵值對。 無論密鑰在外部資料介面上設定哪種格式,鍵值對都會轉換為規範格式。 例如,mykeyMYKEY 都轉換為 Mykey

呼叫函數時來自標頭參數的 args 參數
args 欄位 這是定的嗎? 說明
__ce_body 內文
__ce_headers True 鍵值對中的標頭(文字編碼)(鍵採用規範格式)。
__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;

來自內容類型 application/json 的請求資料的 args 參數

函數接收 JSON 文件的鍵和值作為專用的頂層屬性參數。

如果 HTTP 請求中沒有為 Content-type 設定值,則 Code Engine 函式會使用 application/json 作為預設值。

此外,JSON 負載在 __ce_body 參數中以Base64-encoded格式按原樣(作為位元組數組)提供給函數。

呼叫函數時查詢參數中的 args 參數
args 欄位 這是定的嗎? 說明
__ce_body True 請求資料( Base64-encoded)
__ce_headers True 內容類型已設定
__ce_query "" 空字串
頂級物業 True 每個頂級元素的鍵值對(文字編碼)

存取 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;

來自內容類型 application/octet-stream 的請求資料的 args 參數

函數接收 __ce_body 參數中 __ce_body 資料的Base64-encoded格式的二進位資料:

請求資料中的args參數
args 欄位 這是定的嗎? 說明
__ce_body True 請求資料( Base64-encoded)
__ce_headers True 內容類型已設定
__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;

來自內容類型 text/plain 的請求資料的 args 參數

函數在 __ce_body 參數中接收Base64-encoded格式的文字類型資料:

請求資料中的args參數
args 欄位 這是定的嗎? 說明
__ce_body True 請求資料(文字編碼)
__ce_headers True 內容類型已設定
__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;

來自內容類型 application/x-www-form-urlencoded 的請求資料的 args 參數

函數在 __ce_body 參數中接收文字編碼格式的完整正文資料:

請求資料中的args參數
args 欄位 這是定的嗎? 說明
__ce_body True 請求資料(文字編碼)
__ce_headers True 內容類型已設定
__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;

內容類型 application/x-www-form-urlencoded 請求資料中的 args 參數和查詢參數

混合資料類型的所有組合都是可能的,但請注意,對於 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 字串。 如果 body 為 null、空字串 ("") 或未定義,則視為空。

提供函數執行結果資料的結果資料結構範例:

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

始終設定 bodystatusCodestatusCode 和 body 的隱式設定僅可用於與已棄用的Code Engine函數相容。

headers 元素

標頭部分的主要目的是定義函數將提供回應資料的內容類型。 結果資料支援與請求時接受的相同的 MIME-Type 值。

根據 Content-Type 值的不同,結果結構中的 body 欄位必須包含以下方面:

Body 欄位結果結構
內容類型 指派給 body 元素的值 範例
application/json JSON 物件 body : { key_1: val1 }
未設定(預設) 字串 body : "some text"
text/* 字串 body : "some text"
audio/*example/*font/'image/*video/* 以及所有剩餘類型 Base64-encoded body: "SGVsbG8gV29ybGQhCg=="

此外,功能代碼也可以使用 HTTP 回應標頭中的關鍵值對來提供回應資料。 因此,程式碼必須將唯一的鍵名稱及其值放入 return 語句中使用的資料結構的標頭部分。

請注意這些鍵名稱注意事項:

  • 鍵名不區分大小寫
  • 使用相同鍵名的最新賦值
  • 不支援反斜線或空格

請注意這些價值考量:

  • 值必須是文字編碼的
  • 值必須是資料類型字串或字串陣列

以標頭鍵值對形式傳回回應資料的範例:

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 部分以提供函數的回應資料。 函數代碼負責以與 Content-Type 相符的格式傳遞傳回資料結構中的 body 元素。 如果函數回應 Content-Type 遺失,則函數代碼在外部介面處傳回 Content-Type: text/plain; charset=utf-8,並以未變更的形式 body 欄位中的資料。

根據所使用的內容類型,請考慮以下正文規則。

內容類型 application/json 的正文值

函數程式碼必須提供 body 元素的值作為有效的資料結構( NodeJs-JSON或Python-Dictionary)。 資料結構的鍵和值必須遵循 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,
    }

application/json 回應的Node.js範例:

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

application/octet-stream 回應的Node.js範例:

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 標頭欄位未設定,HTTP 狀態碼的意義可在 Code Engine 函式文件中讀取。 但是,如果設定了標頭欄位,那麼函式的邏輯就定義了 HTTP 狀態碼的意義。

Code Engine 函式服務會對回應資料和內容類型執行有限的有效性檢查,如果資料格式或編碼(由函式碼產生)無效,則會返回 狀態代碼。HTTP 400

HTTP 回應資料

HTTP 外部資料介面上的回應資料與功能代碼在結果資料結構中提供的相同。 只有當 MIME-Typeapplication/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,
  }

使用回應 statusCcodeheader 欄位和回應資料的 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 --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": "/"
        }
    }