パラメーターの挿入

Flex Gateway ポリシー開発キット (PDK) は、​#[entrypoint]​ 設定関数に挿入できる以下のパラメーターを提供します。

  • Configuration​: ポリシーの設定パラメーターを提供します。設定パラメーターの定義方法については、ポリシースキーマ定義の作成を参照してください。

  • Metadata​: ポリシー、Flex Gateway インスタンス、API インスタンス、および Anypoint 組織に関するメタデータを提供します。提供されるメタデータの詳細については、ポリシーのメタデータへのアクセスを参照してください。

  • HttpClient​: ポリシーで HTTP コールを有効にします。ポリシーから HTTP コールを実行する方法の詳細については、HTTP コールの実行を参照してください。

  • CacheBuilder​: ポリシーのキャッシュ機能を提供します。キャッシュの詳細については、ワーカー間でのデータ共有とキャッシュの設定を参照してください。

  • StreamProperties​: 同じ要求を処理する他のポリシーとプロパティを共有するための構造体を提供します。ポリシー間の情報共有の詳細については、ポリシー間のデータ共有を参照してください。

また、​HttpClient​ および ​StreamProperties​ パラメーターをラップされた関数の ​on_request​ または ​on_response​ に直接挿入することもできます。たとえば、​on_request​ 関数の内部で HTTP コールを実行する必要がある場合は、​HTTPClient​ をその関数に直接挿入します。

ベストプラクティスとして、パラメーターは必ず使用する場所にのみ挿入するようにしてください。ただし、ポリシーの適用時に一度だけ実行する初期化ステップがパラメーターに必要な場合は、ラップされた関数のパフォーマンスを向上させるために、パラメーターを ​#[entrypoint]​ に挿入して設定ステップを完了させるのが最善です。

ラップされた関数の on_request と on_response へのパラメーターの挿入

ラップされた関数は以下のパラメーターを受け入れます。

  • HttpClient​: ポリシーで HTTP コールを有効にします。ポリシーから HTTP コールを実行する方法の詳細については、HTTP コールの実行を参照してください。

  • StreamProperties​: 同じ要求を処理する他のポリシーとプロパティを共有するための構造体を提供します。ポリシー間の情報共有の詳細については、ポリシー間のデータ共有を参照してください。

  • RequestState​: 受信したリクエストヘッダーとリクエストボディを操作するための、要求検索条件のさまざまなフェーズへのアクセスを提供します。 RequestState​ は ​on_request​ 関数でのみ使用できます。​RequestState​ のヘッダーとボディの読み取りと書き込みについては、リクエストヘッダーとリクエストボディの読み取りと書き込みを参照してください。

  • ResponseState​: アップストリームのレスポンスヘッダーとレスポンスボディを操作するための、要求検索条件のさまざまなフェーズへのアクセスを提供します。 ResponseState​ は ​on_response​ 関数でのみ使用できます。​ResponseState​ のヘッダーとボディの読み取りと書き込みについては、リクエストヘッダーとリクエストボディの読み取りと書き込みを参照してください。

  • RequestData​: on_request​ 関数と ​on_response​ 関数の間でデータを共有します。 RequestData​ は ​on_response​ 関数でのみ使用できます。​RequestData​ の詳細については、要求と応答でのデータの共有を参照してください。

  • Authentication​: 認証データの読み取りまたは他のポリシーとの共有のためのアクセスを提供します。​Authentication​ の詳細については、要求認証情報へのアクセスを参照してください。

ラップされた関数がこれらのパラメーターを受け取るだけであれば、ラッパーにラムダは必要ありません。たとえば、関数のシグネチャーが次のように定義されているとします。

async fn request_filter(state: RequestState) -> RequestData<String>;
async fn response_filter(state: ResponseState, path: RequestData<String>);

次の例では、関数定義のラムダを定義しています。

let filter = on_request(|request_state| request_filter(request_state))
    .on_response(|response_state, request_data| response_filter(response_state, request_data));

ラムダを定義する代わりに、次の関数定義を使うことができます。

let filter = on_request(request_filter)
        .on_response(response_filter);

ラップされた関数が、他のパラメーター (​#[entrypoint]​ 関数で定義された設定パラメーターなど) を必要とする場合は、そのパラメーターをラップされた関数に挿入します。パラメーターを渡すには、ラムダを定義して変数参照を送信します。例:

async fn request_filter(state: RequestState, conf: &Config, tuple: &(u32, u32)) {
...
}

#[entrypoint]
async fn configure(launcher: Launcher, Configuration(bytes): Configuration) -> Result<()> {
    let config = serde_json::from_slice(&bytes)?;
    let tuple: (u32, u32) = (10, 10);

    let filter = on_request(|request_state| request_filter(request_state, &config, &tuple));

    launcher
        .launch(filter)
        .await?;

    Ok(())
}