DataPower API Gateway のみ

switch ポリシー条件エディターの使用

switch ポリシー条件エディターは、switch ポリシーの case 節の条件を作成するときに役立つユーザー・インターフェースとして機能します。

条件スクリプトの作成は、「グループの追加」オプションと「条件の追加」オプションを使用して、演算子を選択し、事前に提供されている関数を選択することで行います。 結果の条件スクリプトは「出力」フィールドに表示されます。このフィールドは、条件の作成を進めるに従って動的に更新されます。

条件の追加

ポリシー条件エディターを開くと、初期条件が事前に提供され、構成できる状態になっています。

ドロップダウン・リストを使用して、条件の最初に使用する関数を選択します。

API Connectでの JSONata サポート

API Connect は、 JSONata 仕様の v2.0 をサポートしますが、以下の制限があります。

  • JSONata 式を使用してフィールドを抽出または編集する場合、フィールドが異なる場所に存在していても、そのフィールドのソフト・リンク・コピーも抽出ポリシーまたは編集ポリシーの影響を受けます。
  • API Connect では、上位の JSONata 関数 (他の関数を処理する関数) はサポートされていません。
  • API Connect でサポートされる JSONata 関数が上位の関数を引数として呼び出す場合、その引数はサポートされません (上位の関数がサポートされていないため)。
  • 以下の JSONata v2.0 関数はサポートされていません。
    • $eval()
    • $sift()
    • $each()
    • $error()
    • $assert()
  • $fromMillis() は、以下の制限付きでサポートされます。
    • $fromMillis()パラメータは、-5364662400000~2903299199000の範囲の数値をサポートする。
      • 5364662400000より小さい値は-5364662400000を使用する。 つまり、タイムスタンプを1800-01-01T00:00:00Zと報告する。
      • 2903299199000より大きい値は2903299199000を使用する。 つまり、タイムスタンプを2261-12-31T23:59:59Zと報告する。
  • $now() は、以下の制限付きでサポートされます。
    • 以下のコンポーネント指定子はサポートされていません。
      • W = 年内の週
      • w = 月の週
      • X = ISO 週番号付け年
      • x = ISO 週番号付けの月
    • 数値を単語として表すことはサポートされていないため、以下の表示修飾子はサポートされていません。
      • W = 大文字の単語 (例: [YW] => TWO ,000 AND 24)
      • w = 小文字の単語 (例: [Yw] => 2、000、24)
      • Ww = タイトル・ケース・ワード (例: [YWw] => 2 千と 20-4)
    • エラー・メッセージは一般的です。

表 1 に、標準 JSONata 表記で使用できる機能拡張をリストします。 各拡張は、API コンテキストの部分に対応しています。

表 1. JSONata に対する機能拡張
内線 変数 説明
$apiCtx() API コンテキストへの汎用アクセス $apiCtx() 拡張機能は、API コンテキストへの汎用アクセスを提供します。
  • 抽出アクションの変換フィールドの例:
    "$apiCtx().request.uri"
  • switch アクションでのケースの条件の例:
    "$apiCtx().request.path = '/simple/apictx-function'"
$header(name) message.headers.name メッセージ・ヘッダー
$httpVerb() request.verb 要求の HTTP メソッド
$operationID() api.operation.id 操作の ID
$operationPath() api.operation.path 操作のパス
$queryParameter('name')
  • request.parameters.name.locations

    サポートされるキーワードはqueryです。

  • request.parameters.name.values
request.parameters.name.locations内のqueryのインデックスを検索し、request.parameters.name.values[index]を返します。ここで、[index]はロケーション内のqueryの値です。 パラメーター値は URL にデコードされません。
$statusCode() message.status.code 状況コード
$storageType([arg]) variable.body

API コンテキスト内に任意の変数を指定できます。 変数を指定しない場合は、デフォルトの変数message.bodyが使用されます。

メッセージのストレージ・タイプ。 サポートされる値は、 binaryemptygraphqljsonstream、または xmlです。
$urlParameter('name')
  • request.parameters.name.locations

    サポートされるキーワードは、pathおよびqueryです

  • request.parameters.name.values
request.parameters.name.locations内のpathqueryのインデックスを検索し、request.parameters.name.valuesからのpathqueryの両方の値を含む単一の配列を返します。 URL に path と query の両方のパラメーター値が含まれる場合、 配列に含まれる値の順序は、最初が path、続いて query になります。 各パラメーター・タイプの値は、受け取った順に追加されます。 パラメーター値は URL にデコードされます。
例えば、以下の URL には path パラメーターと query パラメーターの両方の値が含まれています。
http://example.com/petstore/cats/adopt?breed=Sphynx&breed=Siamese
$urlParameter('breed')URLは、以下の値の配列を返します。
[cats, adopt, Sphynx, Siamese]

この例では、URLに/petstore/{breed}/{breed}として構成されたAPIパスが含まれています。ここで、breedはAPIパスのパス・パラメーターになるように構成されています。 その結果、catsおよびadoptが出力に組み込まれます。

$xpath(path, xpathExpression) API コンテキスト内で任意の書き込み可能変数を指定できます。 xpathExpressionはリテラル・ストリングでなければなりません。 XPath 式の使用を許可します。 以下の例では、ソース内のすべての price 要素が指定されています。
$xpath($, '//price')

表 2 に、 GraphQL API で使用できる機能拡張をリストします。

表 2. GraphQLのJSONataに対する機能拡張
内線 変数 説明
$gqlActiveOperation([graphql_message]) message.body 指定されたGraphQLメッセージで検出されたアクティブの操作を取得します。 operationNameは、アクティブ操作の名前と同じでなければなりません。
$gqlAlias(graphql_field_node) message.body GraphQLフィールド・ノードの別名を取得します。
$gqlFragments([graphql_message]) message.body 指定されたGraphQLメッセージで検出されたフラグメントを取得します。
$gqlName([graphql_node]) message.body ノード名を取得します。 操作の場合、ノード名はoperationNameです。 フィールド、フラグメント定義、引数、およびその他のエレメントの場合、ノード名はエレメントの名前です。 デフォルトでは、message.bodyoperationNameが取得されます。
$gqlOperations([graphql_message]) message.body 指定されたGraphQLメッセージで検出された操作を取得します。
$gqlType([graphql_node]) message.body アクティブな操作の操作タイプは、照会、ミューテーション、およびサブスクリプションの各照会タイプについて取得されます。
機能拡張に加えて、以下の演算子を使用できます。
  • & (連結) ナビゲーション演算子を使用できます。

以下の JSONata 数値演算子を使用できます。

  • +(加算)
  • - (減算)
  • *(乗算)
  • / (除算)
  • % (モジュロ)

以下の JSONata 比較演算子は、数値またはストリングに使用できます。

  • =
  • !=
  • <
  • >
  • <=
  • >=
以下の演算子および式を使用することもできます。
  • シーケンスを配列に変換したり、演算子の優先順位を指定したり、コンテキスト値で複合式を計算したりするには、括弧を使用します。
  • 配列範囲および述部式。
  • 単一アスタリスク(*)および二重アスタリスク(**)のワイルドカードの文字。
GraphQL照会の以下のエレメントは、示されている構文を使用して、JSONata表記で公開できます。
  • query

    操作とフラグメントを含むGraphQL照会全体。

  • operationName

    匿名操作の場合、operationNameは空にすることができます。

  • ~fragmentSpreadName
  • on~typeCondition
  • ~~fragmentDefinitionName

関数を選択すると、選択した関数に応じて追加のフィールドが表示され、条件を指定できるようになります。 例えば、関数 $httpVerb() を選択すると、比較演算子の選択リスト (= または !=) が表示され、式の右側には、選択項目として HTTP verb のリスト (GETPUTPOSTDELETEHEADOPTIONS、または PATCH) も表示されます。

NOT を選択すると、条件が $not 関数によって否定されます。

さらに条件を追加するには、「条件の追加」をクリックします。次に、この条件と前の条件の間に and 演算子と or 演算子のどちらを挿入するかを選択します。

複数の条件を括弧で囲んでグループ化するには、「グループの追加」をクリックして、グループに条件を追加します。次に、このグループと前の条件またはグループの間に、and 演算子と or 演算子のどちらを挿入するかを選択します。

独自の条件を最初から作成するには、「カスタム」を選択して、表示されたフィールドにスクリプトを入力します。

以下の条件を作成するとします。
($statusCode() != 200 and ($httpVerb() = 'GET' or $httpVerb() = 'PUT'))
この場合は、条件エディターで以下のステップを実行します。
  1. $statusCode() を選択し、比較演算子に != を選択して、条件の右側に表示されたフィールドに 200 と入力します。
  2. 「グループの追加」をクリックします。
  3. 表示された「新規グループ」サブペインで、「条件の追加」をクリックします。
  4. httpVerb() を選択し、比較演算子は = のままにして、条件の右側で GET を選択します。
  5. グループのサブペインで、「条件の追加」を再度クリックします。
  6. httpVerb() を選択し、比較演算子は = のままにして、条件の右側で PUT を選択します。
  7. 2 つの条件の間の比較演算子には or を選択します。

単純条件ステートメント

以下の例は、単一の関数を使用する条件を示しています。

この例では、$httpVerb() 拡張を使用して要求の HTTP メソッドを指定しています。
$httpVerb()="GET"
この例では、$operationPath() 拡張を使用して操作のパスを指定しています。
$operationPath()="/base/path-2"
この例では、$operationID() 拡張を使用して操作 ID を指定しています。
$operationID()="test-gatewayscript-GET"
この例では、$statusCode() 拡張を使用してメッセージ状況コードを指定しています。
$statusCode()=200
この例では、$header(name) 拡張を使用してメッセージ・ヘッダーのコンテンツ・タイプを指定しています。
$header("Content-Type")="application/json"

論理演算子による条件の結合

and演算子とor演算子を使用して、複数の関数を単一の条件に結合できます。

この例では、HTTP GET 要求であること、また、API 操作パスが test-gatewayscript-GET と等しいことを指定しています。
$httpVerb()="GET" and $operationPath()="test-gatewayscript-GET"
この例では、POST または PUT 要求のいずれかであることを指定しています。
$httpVerb()="POST" or $httpVerb()="PUT"
この例では、API 操作 ID が test-gatewayscript_POST と等しく、かつ、メッセージ状況コードが 200 と等しいか、あるいは、API 操作 ID が test-gatewayscript-GET と等しく、かつ、メッセージ状況コードが 500 と等しいことを指定しています。
($operationID()="test-gatewayscript-POST" and $statusCode()=200) or ($operationID()="test-gatewayscript-GET" and $statusCode()=500)
この例では、API 操作 ID が test-gatewayscript-POST と等しく、 メッセージ状況コードが 200 と等しく、さらに、API 操作パスが /base/path-2 と等しいことを指定しています。
($operationID()="test-gatewayscript-POST" and $statusCode()=200) and $operationPath()="/base/path-2"
この例では、メッセージ・ヘッダーのコンテンツ・タイプが text/plain と等しく、 かつ、メッセージ・ヘッダーの長さが 300 と等しいか、あるいは、メッセージ状況コードが 200 と等しいことを指定しています。
($header("Content-Type")="text/plain" and $header("Content-Length")=300) or $statusCode()= 200