関数とのデータ交換
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 エンコード形式(パーセントエンコードとも呼ばれる)のキーと値のペアとして、 HTTP URL で提供することができます。
パーセントエンコーディングは、Web テクノロジーで広く使用されています。 すべての8ビット文字は、パーセント記号(%)を先頭に付けた16進数で表記されます。このタイプのエンコーディングは、 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 エンコード
args
パラメータの内部データ構造を壊す可能性のある、入力「args
パラメータ内の要素には、Base64エンコーディングが使用される。 Base64としてエンコードすることで、値全体が64文字のアルファベットの中で読み取り可能な文字のみで構成されていることを保証するのに役立つ。
以下に例を示します。
"eyAicGxhbmV0MSI6Ik1hcnMiLCAicGxhbmV0MiI6Ikp1cGl0ZXIiIH0="
パーセントエンコーディング( URL エンコーディング)
パーセントエンコーディングは、Web テクノロジーで広く使用されています。 すべての8ビット文字は、パーセント記号(%)を前置した16進数で表記されます。このタイプのエンコードは、 URL エンコードとも呼ばれます。 この関数は、'form-urlencoded
型のデータを生のフォーマットで'__ce_body
パラメータに受け取る。
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
内部入力引数のパラメータセット ( )__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 エンコード)されます。 また、各クエリーパラメーターは、デコードされたフォーマット内のキーと値のペアである:
args フィールド |
これはセットですか? | 説明 |
---|---|---|
__ce_body |
いいえ | Body |
__ce_headers |
ある | content-typeを持たないヘッダー |
__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 フィールド |
これはセットですか? | 説明 |
---|---|---|
__ce_body |
いいえ | Body |
__ce_headers |
ある | key-valueペア(テキストエンコード)のヘッダー(keyはcanonical形式)。 |
__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;
content-typeが'application/json
のリクエスト・データから args
パラメータ。
関数は、JSONドキュメントのキーと値を、専用の最上位プロパティ・パラメータとして受け取ります。
HTTP リクエストで Content-type
に値が設定されていない場合、 Code Engine 機能では application/json
がデフォルトとして使用されます。
さらに、JSONペイロードは、そのまま(バイト配列として)Base64-encoded形式で、'__ce_body
パラメータで関数に提供される。
args フィールド |
これはセットですか? | 説明 |
---|---|---|
__ce_body |
ある | リクエストデータBase64-encoded |
__ce_headers |
ある | Content-typeが設定されている |
__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;
content-typeが'application/octet-stream
のリクエスト・データから args
パラメータ。
この関数は、'__ce_body
パラメータの '__ce_body
バイナリデータをBase64-encoded形式で受け取る:
args フィールド |
これはセットですか? | 説明 |
---|---|---|
__ce_body |
ある | リクエストデータBase64-encoded |
__ce_headers |
ある | Content-typeが設定されている |
__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;
content-typeが'text/plain
のリクエスト・データから args
パラメータ。
関数は、Base64-encodedテキスト型データを'__ce_body
パラメータで受け取る:
args フィールド |
これはセットですか? | 説明 |
---|---|---|
__ce_body |
ある | リクエストデータ(テキストエンコード) |
__ce_headers |
ある | Content-typeが設定されている |
__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;
content-typeが'application/x-www-form-urlencoded
のリクエスト・データから args
パラメータ。
関数は、'__ce_body
パラメータにテキストエンコードされたフォーマットで完全なボディデータを受け取る:
args フィールド |
これはセットですか? | 説明 |
---|---|---|
__ce_body |
ある | リクエストデータ(テキストエンコード) |
__ce_headers |
ある | Content-typeが設定されている |
__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;
content-typeが'application/x-www-form-urlencoded
のリクエストデータとクエリパラメータから args
パラメータを取得する
すべての種類の混合データの組み合わせが可能です。ただし、 HTTP リクエストで URL クエリパラメータとボディパラメータを使用する場合、ボディパラメータはクエリパラメータよりも優先されることにご注意ください。
Code Engine関数環境変数
関数呼び出しのパラメータは、受信した HTTP リクエストから取得されますが、 Code Engine 関数は、システム設定から取得した定義済みの環境変数セットにもアクセスできます
- ce_allow_concurrent
- ce_api_base_url
- CE_DOMAIN
- 実行環境
- 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 の応答を呼び出し元に返します。
プログラミング言語に関係なく、関数コードはreturn文でレスポンス・データをデータ構造として提供しなければならない。
プログラミング言語によって、結果オブジェクトは以下の構造を持つJSONオブジェクトNode.js言語)または辞書Python言語)である:
関数結果データ | 要件 | 説明 |
---|---|---|
headers |
オプション | キーがヘッダー名で、値が文字列、数値、またはブール値である結果オブジェクト。 一つのヘッダーに対して複数の値を送信する場合、ヘッダーの値は複数の値の 配列になる。 デフォルトで設定されるヘッダーはありません。 |
statusCode |
べきである(デフォルト200) | 有効な HTTP 状況コード。 |
body |
オプション(デフォルト:空) | プレーンテキスト、JSONオブジェクトまたは配列、あるいはバイナリデータ用の Base64-encoded 文字列。 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
セクションを含めることができる。 関数コードは、返りデータ構造内の 'body
要素を、マッチするフォーマットで 'Content-Type
に渡す責任を負う。 関数レスポンス「Content-Type
ない場合、関数コードは外部インターフェイスで「Content-Type: text/plain; charset=utf-8
返し、「body
フィールドのデータはそのままの形で返される。
使用されるコンテントタイプに応じて、以下のボディルールを考えてみよう。
content-type「application/json
」のボディ値
関数コードは、'body
要素の値を有効なデータ構造NodeJs-JSONまたはPython)として提供しなければならない。 Code Engine サービスが application/json
HTTP のレスポンスデータセクションでレスポンスデータを配信できるように、データ構造のキーと値はJSON構文規則に従う必要があります。
データ構造内のバックスラッシュ(\
)および二重引用符("
)は、 HTTP のレスポンスデータセクションではテキストエンコード形式で配信されます。
Pythonの'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,
}
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;
content-type「application/octet-stream
」のボディ値
関数コードの結果データは、結果構造体に追加する前にBase64-encodedておく必要がある。
Pythonの'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,
}
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;
content-type「text/plain
」のボディ値
関数コードは、応答全体を単一の文字列で提供しなければならない。 Code Engineファンクション・サービスは、レスポンス・データをチェックしない。
Pythonによる「text/plain
応答の例:
def main(args):
result_body = "myfolder_myFile"
return {
"headers": {
"Content-Type": "text/plain;charset=utf-8",
},
"statusCode": 200,
"body": result_body,
}
content-type「application/x-www-form-urlencoded
」のボディ値(パーセントエンコードされたコンテンツ)
ファンクションコードは、応答データが結果データ構造に追加される前に、 URL エンコードされることを保証するものでなければなりません。 Code Engine の機能サービスは、応答データの正しい構文をチェックしません。 データは、提供されたとおりに発呼側に転送される。
Pythonの'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,
}
外部応答データ・インターフェース
外部データインターフェースの定義は、標準化された 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
存在は、オリジンの指標である。
HTTP ステータスコードの意味は、 Code Engine の機能に関するドキュメントで確認できます。ただし、 x-faas-actionstatus
ヘッダーフィールドが設定されていない場合に限ります。 しかし、ヘッダーフィールドが設定されている場合、関数のロジックによって 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 Enginefunctionsサービスを選択したら、新しい関数を作成します:
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": "/" } }
リクエストボディのコンテンツは、JSON予約文字がエスケープされたまま、 '
__ce_body
引数で変更されずに利用可能である。 -
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予約文字がエスケープされ、Base64-encoded文字列として '__ce_body
に展開されます。 -
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": "/" } }