OData Client Code Generator を使用して作成したプロキシクラスを使用してSitecore Commerce EngineのWeb APIにアクセスする

samatsu 9/28/2017 1943 N/A Sitecore Commerce

Sitecore Commerce Engine は OData サービスの形式でWeb APIを提供しています。今回は、Microsoftが提供するODataODataサービスのメタデータからプロキシを生成する OData Client Code Generator を使用して作成したプロキシクラスを使ってSitecore Commerce Engineが提供するWeb APIにアクセスしてみます。

動作確認環境は次の通りです

  • Visual Studio 2015 Community Edition (英語UI)
  • Sitecore 8.2 update1, Sitecore Commerce 8.2.1
  • サンプルのコマース環境(reference storefront) がセットアップ済み

1. OData Client Code Generator のインストール

Visual Studio を起動してメニューバーの Tools > Extensions and Updates をクリック。 OData Client Code Generator をインストールします。

Visual Studio を再起動して拡張機能のインストール終了です。

2. プロキシの生成

サンプル用のコンソールアプリケーションプロジェクトをセットアップします。プロジェクトを右クリックし、 Add > New Item をクリックします。Codeカテゴリにある OData Client テンプレートからファイルを作成します。

作成したttファイルをダブルクリックし、MetadataDocumentUri の値をOdataサービスのメタデータが公開されているURLに設定します。デフォルトの設定でローカルにインストールされた Sitecore Commerce Engine の場合は、例えば次のURLになります。

http://localhost:5000/api/$metadata

ファイルを保存すると、自動的にプロキシ用のクラスが生成されると思います。

3.サンプルコード

コンソールプログラムでたとえば次の例のようなコードを使って、特定のオーダーやペンディング中のオーダーの一覧にアクセスできます。

    class Program
    {
         static void Main(string[] args)
        {
            var container = new Container(new Uri("http://localhost:5000/api/"));
            container.BuildingRequest += Container_BuildingRequest;

            // 例1:IDを指定して Order を取得
            string orderId = "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXXXX}";
            var query = new DataServiceQuerySingle<Sitecore.Commerce.Plugin.Orders.Order>(container.Orders.Context, $"Orders('{orderId}')");
            var order = query.GetValue();
            Console.WriteLine($"order total:{order.Totals.GrandTotal.Amount}");

            // 例2:Pending Order の Order を取得
            var query2 = new DataServiceQuerySingle<Sitecore.Commerce.Plugin.ManagedLists.ManagedList>(container.ManagedLists.Context, "GetList(id='PendingOrders',type='Sitecore.Commerce.Plugin.Orders.Order, Sitecore.Commerce.Plugin.Orders',skip=0,take=10)").Expand("Items($expand=Components)");
            var pendingOrders = query2.GetValue();
            foreach(var o in pendingOrders.Items.OfType<Sitecore.Commerce.Plugin.Orders.Order>())
            {
                Console.WriteLine(o.Totals.GrandTotal.Amount);
            }
            Console.ReadLine();
        }

        private static void Container_BuildingRequest(Object sender, BuildingRequestEventArgs e)
        {
            e.Headers.Add("Environment", "HabitatAuthoring");
            e.Headers.Add("ShopName", "storefront");
        }
    }

Web APIの呼び出し方は Sitecore Commerce SDKに付属する Postman用のサンプルがたくさんあるので、そちらをベースにしてクエリを組み立てると簡単に作成できると思います。

簡単ですが説明は以上となります。