與函數交換數據
Code Engine 函式服務(或簡單的函式)是透過 HTTP 請求在客戶端完成的。 訊息可以透過以下方式傳遞給函數:
- 作為 URL 的一部分(路徑和可選的查詢參數)
- 透過 HTTP 請求標頭
- 透過 HTTP 請求正文
呼叫者會在用戶端收到這些值,作為 HTTP 的回應。 響應資料傳遞如下:
- 如 HTTP 回應代碼
- 透過 HTTP 回應標頭
- 透過 HTTP 回應正文
所有透過 HTTP 請求調用函式的規則和能力,以及由此產生的 HTTP 回應,都是_外部資料介面_。
傳入的 HTTP 請求會使用_內部請求資料介面_的規則,轉送至功能代碼進行處理。 功能代碼提供的結果必須遵循_內部回應資料介面_的規則。
下圖顯示了來自使用外部資料介面的客戶端的資訊流。 此流程使用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 參數中,取決於呼叫者提供請求資料的方式:
| 參數名稱 | 值類型 | 說明 |
|---|---|---|
__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 欄位 |
這是定的嗎? | 說明 |
|---|---|---|
__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 參數中的鍵值對。 無論密鑰在外部資料介面上設定哪種格式,鍵值對都會轉換為規範格式。 例如,mykey 或 MYKEY 都轉換為 Mykey:
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 欄位 |
這是定的嗎? | 說明 |
|---|---|---|
__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 欄位 |
這是定的嗎? | 說明 |
|---|---|---|
__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 欄位 |
這是定的嗎? | 說明 |
|---|---|---|
__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 欄位 |
這是定的嗎? | 說明 |
|---|---|---|
__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語言):
| 函數結果數據 | 需求 | 說明 |
|---|---|---|
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"}
}
始終設定 body 和 statusCode。 statusCode 和 body 的隱式設定僅可用於與已棄用的Code Engine函數相容。
headers 元素
標頭部分的主要目的是定義函數將提供回應資料的內容類型。 結果資料支援與請求時接受的相同的 MIME-Type 值。
根據 Content-Type 值的不同,結果結構中的 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 返回狀態代碼(即狀態代碼 200 至 599 )。
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函數服務新增下列鍵值對:
| 欄位名稱 | 說明 |
|---|---|
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-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函數以及外部資料介面的用法:
-
將以下程式碼儲存為
hello.js:function main(args) { return { headers: { content_type: "application/json" }, statusCode: 200, body: {args: args} }; } -
登入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 ... -
使用帶有
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": "/" } } -
使用查詢參數呼叫該函數:
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中未修改。 -
使用表單資料呼叫該函數:
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 保留字元。 -
使用 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字串。 -
使用 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中找到。 -
使用文字內容類型呼叫函數:
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 特殊字元。 -
使用二進位內容類型呼叫該函數:
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": "/" } }