機械翻訳について

サービス・レベル変換

サービス・レベル変換は通常、バックエンドのサービス接続およびサービス接続のエンドポイントによって継承できるようにバックエンドに適用されます。 ただし、RESTリソース間、またはシステムのエンドポイント(GETとPOST)間で区別する必要がある場合は、サービス接続またはそのエンドポイントについて、別の.js変換ファイルを選択するか、新しいファイルを作成できます。

サービス・レベル変換の階層内で、エンドポイントはまず変換ファイル、次にサービス接続、次に子バックエンド(存在する場合)、最後にバックエンドについてチェックされます。 検出された最初の変換ファイルが使用されます。上位レベルの変換ファイルは無視されます。

バックエンド、サービス接続またはエンドポイントで提供される変換関数を表示するには、その「概要」タブに移動し、「変換」セクションの「ファイルに移動」リンクをクリックします。 新しい変換関数を作成するには、「ソース」ドロップダウン・リストをクリックし、「作成」を選択します。
jsac-service-connection-transforms-file.pngの説明は以下のとおりです
図jsac-service-connection-transforms-file.pngの説明

サービス・レベル変換の作成例

次のステップでは、サービス接続のバックエンドを作成し、新しいバックエンドとそのサービス接続エンドポイントのテンプレート変換関数を使用してファイルを作成する方法を示します:

  1. 「サービス」パネルを開き、「バックエンド」タブを選択して「追加」(+)アイコンをクリックし、「バックエンド」を選択します。
  2. バックエンドの作成ウィンドウで、「カスタム」を選択してカスタム・バックエンドを作成します。
  3. カスタム・バックエンドの名前を指定し、オプションでその説明を入力します。
  4. インスタンスURLおよびその他の必要な詳細を入力します。 後でバックエンドのサービス接続を作成するときに、このURLがエンドポイントを定義するベースとして使用されます。 「作成」をクリックしてバックエンドを作成します。

  5. 新しいバックエンドのテンプレート変換関数を使用してファイルを作成できるようになりました。 概要タブの変換セクションで、ソースフィールドの下矢印をクリックし、作成を選択します:

  6. 変換ファイルのファイル名を指定します:

  7. 「ベース変換」ドロップダウンで、すべての変換関数の基本コードを指定するファイルを選択します。 ADF REST APIの場合、このファイルは常に選択されます。
  8. 「上書き関数」で、変換ファイルに追加する関数を選択し、OKをクリックします。 選択しない関数は、変換ファイルに追加されません。
  9. 変換ファイルを開くには、ソースフィールドの下にあるファイルに移動をクリックします:

  10. 必要に応じて、関連する変換関数を上書きします。 提供されている組込み変換関数は次のとおりです: ソート、フィルタ、ページ区切り、選択、問合せ(通常はGETコレクション・エンドポイントで使用)、本文(POSTおよびPATCHエンドポイントで使用)およびfetchByKeys。

    transformsContext入力パラメータは、関連するSDPによってすべての変換関数に渡されるコンテキスト・オブジェクトであるため、現在のRESTコールのコンテキスト情報を取得して格納できます。 SDP変数には、変換関数に渡されるtransformsContextプロパティがあります。 SDP transformsContextプロパティの詳細は、「Oracle Visual Builderページ・モデル参照 - transformsContext SDPプロパティ」を参照してください。



    次に、massおよびheightのすべてのフィールドにテキストを追加するbody(result)変換関数の例を示します:

    
            body(result) {
                let tr = {};
                if (result.body) {
                    tr = result.body.results;
                    for (let i = 0; i < tr.length; i++) {
                      tr[i].mass = tr[i].mass + " kilos (kg)";
                      tr[i].height = tr[i].height + " cm";
                    }
                }
               // return tr;
            }

    作成された変換ファイルは、関連するサービス接続によって継承され、「概要」タブの「+サービス接続」ボタンを使用して作成されます。 関連するサービス接続を表示するには、関連サービス接続のロードリンクをクリックします:
    jsac-backend-related-services.jpgの説明は以下のとおりです
    図jsac-backend-related-services.jpgの説明

    エンドポイントからのサービス接続の作成(レスポンス本文の例の取得方法など)の詳細は、「エンドポイントからのサービス接続の作成」を参照してください。

  11. バックエンドの関連サービス接続を追加するには、+サービス接続ボタンをクリックします:

  12. サービス接続エンドポイントのURLを完了し、必要な詳細を指定します。
  13. エンドポイントの変換ファイルを作成するには、ソースフィールドの下矢印をクリックし、作成を選択します:

  14. 変換ファイルを開くには、「ソース」フィールドの下の「ファイルに移動」をクリックします。

Oracle Cloudアプリケーションからではないエンドポイントの例

次に、Oracle Cloudアプリケーションからではないエンドポイントのリクエストおよびレスポンス変換関数の例を示します:
Request
サーバー/エンドポイントに対してリクエストが発行される直前に、リクエスト変換関数がコールされます。 ページ作成者は、オプション(フィルタ、ページ区切り、ソートなど)を変換し、最終的なリクエスト構成を作成できます。 次に、filter「ページ区切り」および「ソート」変換関数の記述方法のサンプルを示します:
filter
/**
 * Filter Transform Function Implementation
 * @param configuration
 * @param options the JSON payload that defines the filterCriterion
 * @param context an object to store/retrieve any contextual information for the 
 *  current request lifecycle
 * @returns {object} configuration object. the url looks like ?filter=foo eq 'bar'
 */
 
PageModule.prototype.filter = function (configuration, options, context) {
  const c = configuration;
  const filterCriterion = options;
 
  function jetFilterOpToScim(fop) {
    switch (fop) {
      case '$eq':
        return 'eq';
      case '$ne':
        return 'ne';
      case '$co':
        return 'co';
      default:
        console.warn('unable to interpret the op ' + fop);
        return null;
    }
  }
 
  function isEmpty(val) {
    return (val === undefined || val === null || val === '');
  }
 
  if (typeof filterCriterion === 'object' && Object.keys(filterCriterion).length > 0) {
    if (filterCriterion.op && filterCriterion.attribute && 
          !isEmpty(filterCriterion.value)) {
      const atomicExpr = {};
      atomicExpr.op = jetFilterOpToScim(filterCriterion.op);
      atomicExpr.attribute = filterCriterion.attribute;
      atomicExpr.value = filterCriterion.value;
 
      if (atomicExpr.op && atomicExpr.attribute) {
        c.url = URI(c.url).addQuery({
          filter: `${atomicExpr.attribute} ${atomicExpr.op} ${atomicExpr.value}`,
        }).toString();
      }
    }
  }
 
  return c;
};
paginate
// paginate Transform Function
// Transform function appends limit and offset parameters to the URL
PageModule.prototype.paginate = function (configuration, options, context) { 
  const c = configuration;
  let newUrl = c.url;
  newUrl = `${newUrl}&limit=${options.size}&offset=${options.offset}`;
  c.url = newUrl;
  return c;
};
sort
/**
 * Sort Transform Function Implementation
 * @param configuration
 * @param options the JSON payload that defines the sortCriteria
 * @param context an object to store/retrieve any contextual information for the
 *  current request lifecycle.
 * @returns {object} configuration object. the url looks like ?orderBy=foo:asc
 */
PageModule.prototype.sort = function (configuration, options, context) {
  const c = configuration;
 
  if (options && Array.isArray(options) && options.length > 0) { 
    const firstItem = options[0]; 
    if (firstItem.name) { 
      const dir = firstItem.direction === 'descending' ? 'desc' : 'asc' 
      let newUrl = c.url; 
      newUrl = `${newUrl}&orderBy=${firstItem.attribute}:${dir}`; 
      c.url = newUrl; 
    } 
  } 
  return c; 
};
Response
レスポンス変換ファンクションは、リクエストが正常に返された直後にコールされます。 「ページ区切り」変換ファンクションの記述方法のサンプルを次に示します:
// paginate() Response Transform Function
PageModule.prototype.paginateResponse = function (result, context) {
  const ps = {}; const tr = {};
 
  if (result.body) {
    const rb = result.body;
    if (rb.totalCount) {
      tr.totalSize = rb.totalCount;
    }
    if (rb.totalCount > 0) {
      tr.hasMore = !!rb.hasMore;
    } else {
      tr.hasMore = false;
    }
  }
  return tr;
};