フローの構成

フローは API プロキシの基本構成要素です。フローを使用すると、API プロキシがポリシーやコードを実行する順序を構成することで、API の動作をプログラムできます。

フローのコンセプトについては、フローによるプロキシの実行の制御をご覧ください。

このトピックでは、条件フローの作成方法とフローへのロジック(ポリシー)の追加方法について大まかに説明します。条件を作成する技法には、このトピックで説明しているより細かい事柄が含まれます。詳細については、フロー変数の概要およびフロー変数での条件をご覧ください。

フローへのポリシーの接続

Edge には、セキュリティの実装、トラフィックの管理、メッセージの操作のために、さまざまなタイプの事前定義ポリシーが用意されています。さらに、ポリシーを使用すると、独自のカスタムコードを追加してメッセージ処理を自由にカスタマイズできます。

次に例を示します。

  • OAuth セキュリティ ポリシーを ProxyEndpoint のリクエスト PreFlow にアタッチしますProxyEndpoint のリクエスト PreFlow はパイプラインで最初のフローなので、これがセキュリティ保護ポリシーに違反していた場合はリクエストを直ちに却下できます。
  • JSON から XML への変換ポリシーを TargetEndpoint のレスポンス PostFlow にアタッチして、レスポンスを JSON から XML に変換します。
  • JavaScript ポリシーを ProxyEndpoint の条件フローにアタッチして、リクエストを処理するための JavaScript コードを実行します。

条件付きフローを作成したら、ポリシーのアタッチに利用できます。フローが選択されている状態で、リクエストまたはレスポンス図の [+ Step] アイコンをクリックして、フローに新規または既存のポリシーを追加します。

選択したフローにポリシーをアタッチすれば、そのフロー URI と動詞の組み合わせに対して行われたリクエストに対してのみ割り当てポリシーを強制するように API プロキシを構成できます。たとえば、ポリシーをリクエストの learn フローにアタッチした場合、次の XML がプロキシ エディタのコードビューに生成されます。

<ProxyEndpoint name="default">
...
   <Flow name="issue">
        <Description/>
        <Request>
            <Step>
                <Name>Quota-2</Name>
            </Step>
        </Request>
        <Response/>
        <Condition>(proxy.pathsuffix MatchesPath "/issue/**") and (request.verb = "GET")</Condition>
    </Flow>
...
</ProxyEndpoint>

この構成では、GET リクエストが URI パターン.../issue/**(/issue/ と、URI の最後のスラッシュよりも後にあるもの)とともに API プロキシに届くと、その API 呼び出しに割り当てが適用されます。

条件付きフローについて

PreFlow または PostFlow にアタッチされたポリシーは必ず実行されます。一方、条件付きフローに含まれるポリシーは、フローの条件が true と評価された場合にのみ実行されます。

リクエストやレスポンスの処理中、セグメントごとに 1 つの条件フロー(条件が true と評価された最初のフロー)だけが実行されます。つまり、条件付きフローは以下のそれぞれの一部として 1 つだけ実行できます。

  • ProxyEndpoint のリクエスト パイプライン
  • TargetEndpoint のリクエスト パイプライン
  • ProxyEndpoint のレスポンス パイプライン
  • TargetEndpoint のレスポンス パイプライン

動画: 条件フローについて詳しく説明する短い動画をご覧ください。

たとえば、以下の ProxyEndpoint 定義に示されている条件フローは、ProxyEndpoint によって、API プロキシに対するあらゆる HTTP GET リクエストに対して実行されます。

<ProxyEndpoint name="default">
  <PreFlow>
    <Request/>
    <Response/>
  </PreFlow>
  <Flows>
    <Flow name="Flow-1">
      <Condition>request.verb="GET"</Condition>
      <Request/>
      <Response/>
    </Flow>
  </Flows>
  <PostFlow>
    <Request/>
    <Response/>
  </PostFlow>
  ...
</ProxyEndpoint>

条件が参照しているのは、request.verb フロー変数です。フロー変数は名前付き参照で、Edge によって処理された API トランザクションに関連付けられている状態情報を保持します。Edge は、参照可能な数多くの状態変数を定義します。

RESTful サービスは、API リソースのコレクションです。API リソースは、デベロッパーが API を呼び出すことでアクセスできる複数のエンティティを識別する URI パス フラグメントです。たとえば、気象情報と天気予報を提供しているサービス バックエンドでは、API リソース /reports/forecasts にマッピングされた 2 つの条件フローが API で定義されている可能性があります。API 呼び出しでどちらかのリソースが URL に含まれていた場合、条件は true と評価され、該当する条件付きフローにアタッチされたロジックが実行されます。

このようにしておくと、アプリのデベロッパーは以下の形式の URL に対してリクエストを作成することでリソースにアクセスできます。

http://myAPIs.myCo.com/weather/reports

または

http://myAPIs.myCo.com/weather/forecasts

API プロキシでは、特定のリソースに対応する条件フローを定義できます。

<ProxyEndpoint name="default">
  <PreFlow>
    <Request/>
    <Response/>
  </PreFlow>
  <Flows>
    <Flow name="Flow-1">
      <Condition>(proxy.pathsuffix MatchesPath "/reports")</Condition>
      <Request/>
      <Response/>
    </Flow>
    <Flow name="Flow-2">
      <Condition>(proxy.pathsuffix MatchesPath "/forecasts")</Condition>
      <Request/>
      <Response/>
    </Flow>
  </Flows>
  <PostFlow>
    <Request/>
    <Response/>
  </PostFlow>
  ...
</ProxyEndpoint>

この例で参照されているのは proxy.pathsuffix フロー変数で、API プロキシへのアクセスに使用される URL のサフィックス部分が格納されています。そのため、これを使用して各リソースの条件フローに異なるポリシーをアタッチできます。

条件付きフローの追加

この簡単な例では、リクエスト メッセージが HTTP GET だった場合にのみ実行されるフローを設定します。

条件付きフローを追加するには、API プロキシ ビルダーで [Develop] ビューを選択します。目的のエンドポイントの [+] アイコンをクリックします。

[New Conditional Flow] フォームでは、フローに名前を付け、条件を構成できます。以下の例では、ベースパスの後ろ、任意の URI に対する(PUT、POST などではなく)GET 動詞について、リクエスト メッセージの HTTP を評価する単純な条件を追加しています。

(条件文の作成方法については、フロー変数と条件をご覧ください)。

Flow-1 という新しいフローが [Navigator] メニューに表示されます。

では、ProxyEndpoint の XML 構成を見てみましょう。[Navigator] メニューで [Flow-1] を選択します。

以下の構成が表示されます。

<PreFlow name="PreFlow">
    <Request/>
    <Response/>
</PreFlow>
<Flows>
    <Flow name="Flow-1">
      <Request/>
      <Response/>
      <Condition>(proxy.pathsuffix MatchesPath "/**") and (request.verb = "GET")</Condition>
    </Flow>
</Flows>
<PostFlow name="PostFlow">
    <Request/>
    <Response/>
</PostFlow>

次のステップ

条件の構成や変数の使用については、以下のトピックで詳しく説明しています。