このページの内容は Apigee と Apigee ハイブリッドに該当します。
Apigee Edge のドキュメントを表示する。
FlowCallout
ポリシーを使用して、API プロキシまたは別の共有フローから共有フローを呼び出すことができます。
共有フローでは、実行時に複数の場所から再利用できる一連のステップを作成します。これらのステップは、API プロキシ内でポリシーとして実装されます。FlowCallout
ポリシーを使用すると、API プロキシや他の共有フローから共有フローを呼び出すことができます。これは、従来のプログラミング言語の関数呼び出しのように機能します。
- たとえば、API キー検証、OAuth トークンの検証、正規表現保護などのセキュリティ機能のある共有フローを構築したとします。この共有フローは、受信リクエストの確認方法を示しています。
FlowCallout
ポリシーを使用すると、複数の API プロキシからその共有フローを呼び出すことができます。 - 共有フロー内から
FlowCallout
ポリシーを実装することで、別のフローから特定の共有フローを呼び出せます。
このポリシーは 拡張可能なポリシーであり、Apigee ライセンスによっては、このポリシーの使用によって費用や使用率に影響する場合があります。ポリシータイプと使用量への影響については、ポリシータイプをご覧ください。
サンプル
共有フローの API キーを確認する
この例では、共通のセキュリティ関連タスクを実行するために共有フローが使用されています。ここで共有フローは API キーを検証します。API プロキシや他の共有フローは、この共有フローに呼び出しを行うために、FlowCallout
ポリシーを使用できます。
次の共有フロー定義には、API プロキシの FlowCallout
ポリシーから共有フローが呼び出されたときに実行される Verify-API-Key
ポリシーが含まれています。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <SharedFlow name="default"> <Step> <Name>Verify-API-Key</Name> </Step> </SharedFlow>
上記の共有フロー内の VerifyAPIKey
ポリシーでは、キー値を取得して検証します。
<VerifyAPIKey async="false" continueOnError="false" enabled="true" name="Verify-API-Key"> <DisplayName>Verify API Key</DisplayName> <APIKey ref="request.queryparam.apikey"/> </VerifyAPIKey>
API プロキシで使用される次の FlowCallout
ポリシーは、上記の共有フローを呼び出して、API キーを検証します。verify-apikey-shared
共有フローバンドル(ここでは省略)は、APIProxy バンドルがプロキシを構成する方法で共有フローを構成します。
<FlowCallout async="false" continueOnError="false" enabled="true" name="Auth-Flow-Callout"> <DisplayName>Auth Flow Callout</DisplayName> <SharedFlowBundle>verify-apikey-shared</SharedFlowBundle> </FlowCallout>
パラメータを共有フローに渡す
この例は、FlowCallout
ポリシーから共有フローにパラメータを渡す方法を示しています。ここで、FlowCallout
ポリシーは、共通の文字列処理関数を実行するように設計した共有フローを呼び出します。共有フローには、入力データの連結、その入力データの小文字への変換、またはその両方を行う JavaScript が含まれます。FlowCallout
ポリシーは、文字列の入力、出力、および入力の処理方法を指定するパラメータを定義します。
String-Handler
FlowCallout
ポリシーでは共有フローを呼び出し、共有フローの出力、使用する共有フロー オペレーション、使用する入力(ここでは文字列リテラルですが、フロー変数にすることもできます)を保存する変数を指定するパラメータを渡します。Parameter
要素では、ランタイムを作成する変数の名前と値を指定します。共有フローは、こうした変数を取得して、独自のコードで使用できます。<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <FlowCallout async="false" continueOnError="false" enabled="true" name="String-Handler"> <DisplayName>String Handler</DisplayName> <Parameters> <Parameter name="input">Gladys Kravitz</Parameter> <Parameter name="operations">concatenate tolowercase</Parameter> <Parameter name="outputVariable">string.handler.output</Parameter> </Parameters> <SharedFlowBundle>StringHandler</SharedFlowBundle> </FlowCallout>
次の
default
共有フローには、FlowCallout
ポリシーから共有フローが呼び出されたときに実行されるSharedStringFunctions
JavaScript ポリシーが含まれています。<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <SharedFlow name="default"> <Step> <Name>SharedStringFunctions</Name> </Step> </SharedFlow>
共有フローでは、次の
SharedStringFunctions
JavaScript ポリシーで、実行するコードを含むSharedStringFunctions.js
JavaScript ファイルを指定しています。<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" name="SharedStringFunctions"> <DisplayName>SharedStringFunctions</DisplayName> <Properties/> <ResourceURL>jsc://SharedStringFunctions.js</ResourceURL> </Javascript>
次の JavaScript
SharedStringFunctions.js
は、SharedStringFunctions
JavaScript ポリシーから実行されます。このスクリプトでは、FlowCallout
ポリシーのParameter
要素から作成された変数から値を取得します。// Input value from the calling API proxy. var handledString = context.getVariable("input"); // Variable to use for output from this script. var outputVariable = context.getVariable("outputVariable"); // A space-separated list of things to do to the input string. // Convert to lower case to handle unintentional capitals in configuration. var operation = context.getVariable("operations").toLowerCase(); // If "lowercase" was given as an operation, convert the input to lowercase. if (operation.includes("tolowercase")) { handledString = handledString.toLowerCase(); } // If "concatenate" was given as an operation, concatenate the input. if (operation.includes("concatenate")) { handledString = handledString.replace(/\s+/g, ''); } // Assign the resulting string to the output variable specified by // the calling API proxy. context.setVariable(outputVariable, handledString);
- 実行は、JavaScript ポリシーから共有フローに戻り、それから元の API プロキシの
FlowCallout
ポリシーに戻ります。
要素リファレンス
このポリシーで構成できる要素と属性は次のとおりです。
<FlowCallout async="false" continueOnError="false" enabled="true" name="Flow-Callout-1"> <DisplayName>Custom label used in UI</DisplayName> <SharedFlowBundle>thereferencedsharedflowbundle</SharedFlowBundle> </FlowCallout>
<FlowCallout> 属性
<FlowCallout async="false" continueOnError="false" enabled="true" name="Flow-Callout-1">
次の表に、すべてのポリシーの親要素に共通する属性を示します。
属性 | 説明 | デフォルト | 要否 |
---|---|---|---|
name |
ポリシーの内部名。 管理 UI プロキシ エディタで |
なし | 必須 |
continueOnError |
ポリシーが失敗したときにエラーを返す場合は、 ポリシーが失敗した後もフローの実行を続行する場合は、 |
false | 省略可 |
enabled |
ポリシーを適用するには、 ポリシーを無効にするには、 |
true | 省略可 |
async |
この属性は非推奨となりました。 |
false | 非推奨 |
<DisplayName> 要素
管理 UI プロキシ エディタで name
属性と一緒に使用して、ポリシーのラベルに使用する自然言語名を指定します。
<DisplayName>Policy Display Name</DisplayName>
デフォルト |
なし この要素を省略した場合、ポリシーの |
---|---|
要否 | 省略可 |
タイプ | 文字列 |
<SharedFlowBundle> 要素
呼び出す共有フローの名前を指定します。この要素の値は、対象の <SharedFlowBundle>
要素の name 属性の値と同じである必要があります。
<SharedFlowBundle/>
最も単純な例では、呼び出されているこの要素の値として共有フローの名前を指定します。つまり、この要素の値は、共有フローの name
属性の値と同じである必要があります。
<SharedFlowBundle>Shared-Flow-Name</SharedFlowBundle>
デフォルト | なし |
---|---|
要否 | 必須 |
型 | なし |
属性
なし。
<Parameter> 要素
このポリシーで呼び出される共有フローに変数として渡すパラメータと値(または値のソース)を指定します。
パラメータを使用すると、ポリシーで呼び出す共有フローに渡す必要がある値(または値を含む変数)を指定できます。これは概念的には、関数呼び出しでパラメータを指定するのと似ています。関数パラメータと同様に、FlowCallout
パラメータの値は、共有フロー呼び出しのコンテキストに基づいて変化する可能性があります。
FlowCallout
パラメータは、共有フローの実行時にのみ表示されます。
構文
この要素は、次のいずれかの構文形式で使用できます。リテラル値を使用する場合、指定する値の形式は、使用するコードによって異なります。
<!- A literal value in an attribute. --/> <Parameter name="parameter-name" value='parameter-value' /> <!- A reference to a variable in an attribute. --/> <Parameter name="parameter-name" ref='source-variable-name' /> <!- A literal value in the element content. --/> <Parameter name="parameter-name">parameter-value</Parameter> <!- An reference to an attribute in the element content. --/> <Parameter name="parameter-name">{source-variable-name}</Parameter>
例
この String-Handler
FlowCallout
ポリシーでは、共有フローの出力を保存する場所と使用する入力を指定するパラメータを渡します。Parameter
要素では、ランタイムを作成する変数の名前と値を指定します。共有フローは、こうした変数を取得して、独自のコードで使用できます。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <FlowCallout async="false" continueOnError="false" enabled="true" name="String-Handler"> <DisplayName>String Handler</DisplayName> <Parameters> <Parameter name="input">Gladys Kravitz</Parameter> <Parameter name="outputVariable">string.handler.output</Parameter> </Parameters> <SharedFlowBundle>StringHandler</SharedFlowBundle> </FlowCallout>
デフォルト | なし |
---|---|
要否 | 必須 |
型 | なし |
属性
属性 | 説明 | デフォルト | 要否 | 型 |
---|---|---|---|---|
name |
このパラメータで作成するランタイム変数の名前。 | なし | 必須 | 文字列 |
ref |
実行時に使用する値を含む変数。使用するリテラル値を指定する場合は、この属性を省略します。 |
なし | 任意 | 文字列 |
value |
このパラメータで作成されたランタイム変数で使用する値。値のソースにする必要がある変数の名前を指定する場合は、この属性を省略します。 | なし | 任意 | 文字列 |
<Parameters> 要素
このポリシーによって呼び出される共有フローに変数として渡す <Parameter> 要素のセットを指定します。
構文
<Parameters> <Parameter name="parameter-name" value='parameter-value' /> </Parameters>
デフォルト | なし |
---|---|
要否 | 省略可 |
型 | なし |
属性
なし。
スキーマ
フロー変数
フロー変数を使用すると、HTTP ヘッダー、メッセージ コンテンツ、またはフロー コンテキストに基づいて、ランタイムのポリシーとフローを動的に動作させることが可能です。フロー変数の詳細については、変数リファレンスをご覧ください。
変数 | 説明 |
---|---|
|
スコープ: 共有フローの実行中 共有フローの name 属性の値。 |
|
スコープ: フローフックに接続された共有フローの実行中。 フローフックの名前。 |
エラー リファレンス
このセクションでは、このポリシーによってエラーがトリガーされたときに返される障害コードとエラー メッセージ、Apigee によって設定される障害変数について説明します。これは、障害に対処する障害ルールを作成するうえで重要な情報です。詳細については、ポリシーエラーについて知っておくべきことと障害の処理をご覧ください。
ランタイム エラー
このエラーは、ポリシーの実行時に発生することがあります。
障害コード | HTTP ステータス | 原因 | 修正 |
---|---|---|---|
flow.SharedFlowNotFound |
500 |
共有フローが存在しません。あるいは、共有フローは存在していますが、デプロイされていません。 | build |
デプロイエラー
なし
関連トピック
- 共有フローの作成: 再利用可能な共有フロー
- 複数のプロキシ間での共有フローの実行: フローフックを使用した共有フローの接続