---
title: "SXAのストアフロントがCommerce Engineに呼び起こす"
slug: "sxa-storefront-calls-to-commerce-engine"
abstract: "SXA StorefrontがCommerce Engineに通話を行う方法の概要。"
---
# SXAのストアフロントがCommerce Engineに呼び起こす

Commerce Connectは異なる外部コマースシステムと連携して設計されているため、各サービスレイヤーにはデフォルトのドメインモデルが付属しています。これらのドメインモデルは、各サービスレイヤーが対象とするシナリオに必要な共通データAPI表しています。Sitecore XC 9.3以前は、Commerce EngineへのAPIすべての呼び出しはCommerce Connectサービス層を経由していました。Commerce Connectはまた、xDBにおけるSitecoreの分析イベントをトリガーする[Experience Analyticsとの統合](https://doc.sitecore.com/xp/ja/developers/102/sitecore-experience-commerce/create-a-personalized-storefront-experience.html "Create a personalized storefront experience") としても機能します。分析が不要な場合、通話は店舗から直接Commerce Engineへ送る方が理にかなっており、以下の図が示すように、ドメインモデル間のデータをマッピングする不要な作業を回避できます。

![Storefront calls to Commerce Engine](https://doc.sitecore.com/api/markdown-image/xp/ja/developers/102/sitecore-experience-commerce/images/StorefrontCallsToEngine.png)

サービス層APIはストアフロントとコマースエンジン間で共通データを渡します。サービス層APIは[Experience Analytics(XA](https://doc.sitecore.com/xp/ja/developers/102/sitecore-experience-commerce/experience-analytics-commerce-tab.html "Experience Analytics Commerce tab") )と統合されており、詳細なデータを収集して、顧客がコマースシナリオで行うアクションに基づくレポート、パーソナライズ、マーケティング自動化を可能にします。XAとの統合が不要な場合、Commerce Connectをバイパスすることで柔軟性とパフォーマンスが向上します。Commerce Engineを呼び出すことで、ドメインモデルへのデータのマッピングやドメインモデルからの呼び戻しが直接不要になります。マッピング自体はリソースを消費し、拡張に対応するためにカスタムオブジェクトを定義・登録する必要があるため、拡張が容易ではありません。JSON形式でデータを渡す方が、コード登録が不要でパフォーマンスオーバーヘッドも少ないため、拡張や消費が容易です。そのため、Sitecore XC 9.3からは、Experience Analyticsとのやり取りを伴わず、直接Commerce Engineに向かうAPI通話が新機能として導入されました。

以下のセクションでは、直接通話の実装パターンや、Commerce Engineへの直接通話の方法を示す例を紹介します。

> !注現在も通話はContent Delivery(CD)サーバーの役割を経由しています。つまり、AJAXの通話の場合、通話は依然として顧客のブラウザから発信され、まずCDインスタンスに送られ、そこから直接Commerce Engineへ送られます。将来のリリースでは、通話は顧客のブラウザから直接行い、Commerce Engineに送られ、CDインスタンスをバイパスしてCommerceエンジンに送られる可能性があります。これはCommerce Engine APIの適切なセキュリティ対策が整っている前提です。

## 実装パターン

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

1.  Commerce EngineのターゲットメソッドにURIを取得してください。
2.  HTTPリクエストヘッダーにコンテキスト情報を追加します。
3.  リクエストの本文に入力パラメータを追加してください。
4.  HTTPリクエストを非同期でSendします。
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);
 }