SXA Storefront による Commerce Engine の呼び出し

概要

SXA Storefront が Commerce Engine を呼び出す方法の概要。

Commerce Connect は、さまざまな外部 Commerce システムで動作するように設計されているため、各サービス レイヤー用のデフォルトのドメイン モデルが付属しています。これらのドメイン モデルは、各サービス レイヤー API がターゲットとするシナリオに必要な共通データを表しています。Sitecore XC 9.3 より前は、Commerce Engine へのすべての API 呼び出しは Commerce Connect サービス レイヤーを経由していました。Commerce Connect は、Sitecore でエクスペリエンス アナリティクスとの統合としても機能し、xDB で分析イベントをトリガーします。分析が不要な場合は、次の図に示すように、呼び出しをストアフロントから Commerce Engine に直接送信する方が理にかなっています。これにより、ドメイン モデルとの間でデータをマップする必要がなくなります。

Storefront による Commerce Engine の呼び出し

サービス レイヤー API により、ストアフロントと Commerce Engine の間で共通データが渡されます。サービス レイヤー API はエクスペリエンス アナリティクス (XA) と統合されているため、詳細なデータを収集して、Commerce シナリオで顧客が実行したアクションに基づいて、レポート、パーソナライゼーション、およびマーケティングの自動化を実現できます。XA との統合が必要ない場合は、Commerce Connect をバイパスすると、柔軟性とパフォーマンスが向上します。Commerce Engine を直接呼び出すと、ドメイン モデルへのデータのマッピングと、ドメイン モデルからのコールバックが不要になります。マッピング自体がリソースを消費し、拡張に対応するためにカスタム オブジェクトを定義および登録する必要があるため、マッピングを簡単に拡張することはできません。JSON 形式でのデータの受け渡しは、コード登録を必要とせず、パフォーマンスのオーバーヘッドが少ないため、より簡単に拡張および使用できます。このため、Sitecore XC 9.3 以降、エクスペリエンス アナリティクスとの対話なしに Commerce Engine に直接アクセスする API 呼び出しが、新しい機能として導入されました。

次のセクションでは、直接呼び出しの実装パターンと、Commerce Engine への直接呼び出しを行う方法を示す例を示します。

注記

現在も、呼び出しは Content Delivery (CD) サーバー ロールを経由します。つまり、AJAX 呼び出しの場合も、顧客のブラウザーから作成され、最初に CD インスタンスにアクセスし、そこから Commerce Engine に直接アクセスします。将来のリリースでは、Commerce Engine API に関する適切なセキュリティ対策が講じられていることを前提として、顧客のブラウザーから直接呼び出しを行い、CD インスタンスをバイパスして Commerce Engine にアクセスできるようになる可能性があります。

実装パターンの一般的な説明は、次の 6 つの部分から成ります。

  1. Commerce Engine のターゲット メソッドの URI を取得します。

  2. HTTP 要求ヘッダーにコンテキスト情報を追加します。

  3. 要求の本文に入力パラメーターを追加します。

  4. HTTP 要求を非同期で送信します。

  5. 結果を待機します。

  6. HTTP 結果の本文を文字列値として返します。文字列値は常に JSON 形式になります (呼び出し元のコードによって解釈されます)。

次のコードは、ストアフロントから Commerce Engine への直接呼び出しを行って、顧客の設定と選択に基づいて商品バンドルの価格を取得するための実装パターンの例です。

 /// <summary>
        /// Gets the bundle selection price.
        /// </summary>
        /// <param name="model"></param>
        /// <returns>string of JSON containing prices</returns>  
        public virtual async Task<string>  GetBundleSelectionPrice(BundleItemModel model)
        {
            // Obtain URI to targeted method for Commerce Engine
            var uri = new Uri(CommerceEngineConfiguration.Instance.ShopsServiceUrl + "GetBundleSelectionPrice");
                           // Add context information in header
            var request = new HttpRequestMessage(HttpMethod.Post, uri);
            request.Headers.Add("ShopName", StorefrontContext.CurrentStorefront.ShopName);
            request.Headers.Add("Environment", EngineConnectUtility.GetShopEnvironment());
            request.Headers.Add("EffectiveDate", GetCurrentDate().ToString(CultureInfo.InvariantCulture));
            request.Headers.Add("Language", Context.Culture.Name);
            request.Headers.Add("Currency", StorefrontContext.CurrentStorefront.SelectedCurrency);
            request.Headers.Add("IsRegistered", Context.User.IsAuthenticated.ToString(CultureInfo.InvariantCulture));
            request.Headers.Add("Authorization", CommerceEngineConfiguration.Instance.AccessToken);

            // set content by adding the input parameter containing the model
            var modelStr = JsonConvert.SerializeObject(model);
            request.Content = new StringContent(modelStr, Encoding.UTF8, "application/json");

                            // Wait for the result
            var result = await HttpClient.SendAsync(request).ConfigureAwait(false);

            return await 
result.Content.ReadAsStringAsync().ConfigureAwait(false);
        }