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 エンコード形式(パーセントエンコードとも呼ばれる)のキーと値のペアとして、 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 引数に現れる可能性がある:

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 エンコード)されます。 また、各クエリーパラメーターは、デコードされたフォーマット内のキーと値のペアである:

関数呼び出し時のクエリ・パラメータからの args パラメータ
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パラメーター
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 パラメータ
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言語)である:

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ファンクションサービスは、以下のキーと値のペアを追加します:

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関数の作成と、外部データ・インターフェースの使用法をご覧ください:

  1. 以下のコードを hello.js としてローカルに保存する:

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

    リクエストボディのコンテンツは、JSON予約文字がエスケープされたまま、 '__ce_body 引数で変更されずに利用可能である。

  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予約文字がエスケープされ、Base64-encoded文字列として '__ce_body に展開されます。

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