Dynamics CRM 2016 SDK 新機能: Web API その 11: 探索サービス

みなさん、こんにちは。

前回に引き続き、Dynamics CRM 2016 SDK の新機能として
正式版となった Web API について紹介します。

今回は Web API の機能より 探索サービスを紹介します。

概要

Web API の探索サービスは、既存探索サービス同様、ユーザーが
所属する組織の情報を取得することができます。

探索サービスの実行

まずは単純にユーザーが所属する組織一覧と詳細を表示します。

プログラムの実装

1. 前回利用した Visual Studio ソリューションを開き、Program.cs
ファイルを開きます。新しく以下のメソッドを追加します。
アドレスが今までと異なり、探索サービス用のアドレスとなります。

探索サービス用のアドレスは環境によって異なります。Microsoft
Dynamics CRM Online の場合はリージョンに一致したアドレスを
ご利用さい。
例) 日本の場合: disco.crm7.dynamics.com
US の場合: disco.crm.dynamics.com

public async Task RunDiscovery(string accessToken)
{
    // HttpClient の作成
    using (HttpClient httpClient = new HttpClient())
    {
        // Web API 探索アドレスの作成
        string serviceUrl = "https://disco.crm7.dynamics.com/api/discovery/v8.0/";
        // ヘッダーの設定
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

    }
}

2. Main メソッドの以下のコードを書き換えて、新しいメソッドを
呼ぶように変更します。

元)  
Task.WaitAll(Task.Run(async () => await app.RunImpersonate(result.AccessToken)));

変更後)
Task.WaitAll(Task.Run(async () => await app.RunDiscovery(result.AccessToken)));

3. 新しく追加した RunDiscoveryメソッド内に以下のコードを追加して、 探索サービスを
実行します。

// ユーザーが所属する組織一覧の取得
HttpResponseMessage orgRes = await httpClient.GetAsync(serviceUrl + "Instances");
JToken orgs = JObject.Parse(orgRes.Content.ReadAsStringAsync().Result)["value"];

4. 以下のコードを追加して、取得結果を表示します。

foreach(JToken org in orgs)
{
    Console.WriteLine("API URL: {0}", org["ApiUrl"]);
    Console.WriteLine("フレンドリー名: {0}", org["FriendlyName"]);
    Console.WriteLine("Id: {0}", org["Id"]);
    Console.WriteLine("ステータス: {0}", org["State"]);
    Console.WriteLine("固有組織名: {0}", org["UniqueName"]);
    Console.WriteLine("アプリケーション URL: {0}", org["Url"]);
    Console.WriteLine("URL名: {0}", org["UrlName"]);
    Console.WriteLine("バージョン: {0}", org["Version"]);
}

動作確認

1. F5 キーを押下してプログラムを実行します。

2. 認証ダイアログが表示されたらログインします。

image

3. ユーザーが所属する組織の詳細が表示されます。

image

探索サービスを利用したクエリ

探索サービスも OData を利用したクエリが可能です。

プログラムの実装

1. 上記のコードに続いて以下のコードを追加します。ここではバージョンが
8 から始まる組織のフレンドリー名と ID を取得しています。

// ユーザーが所属する組織一覧の取得
HttpResponseMessage org8Res = await httpClient.GetAsync(serviceUrl + "Instances?$select=FriendlyName,Id&$filter=startswith(Version, '8')");
JToken org8s = JObject.Parse(org8Res.Content.ReadAsStringAsync().Result)["value"];

2. 以下のコードを追加して結果を表示します。

foreach (JToken org8 in org8s)
{
    Console.WriteLine("フレンドリー名: {0}", org8["FriendlyName"]);
    Console.WriteLine("Id: {0}", org8["Id"]);                   
}

動作確認

1. F5 キーを押下してプログラムを実行します。

2. 認証ダイアログが表示されたらログインします。

3. 期待した結果が表示されることを確認します。

以下に今回追加したメソッドを示します。

public async Task RunDiscovery(string accessToken)
{
    // HttpClient の作成
    using (HttpClient httpClient = new HttpClient())
    {
        // Web API 探索アドレスの作成
        string serviceUrl = "https://disco.crm7.dynamics.com/api/discovery/v8.0/";
        // ヘッダーの設定
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

        // ユーザーが所属する組織一覧の取得
        HttpResponseMessage orgRes = await httpClient.GetAsync(serviceUrl + "Instances");
        JToken orgs = JObject.Parse(orgRes.Content.ReadAsStringAsync().Result)["value"];

        foreach(JToken org in orgs)
        {
            Console.WriteLine("API URL: {0}", org["ApiUrl"]);
            Console.WriteLine("フレンドリー名: {0}", org["FriendlyName"]);
            Console.WriteLine("Id: {0}", org["Id"]);
            Console.WriteLine("ステータス: {0}", org["State"]);
            Console.WriteLine("固有組織名: {0}", org["UniqueName"]);
            Console.WriteLine("アプリケーション URL: {0}", org["Url"]);
            Console.WriteLine("URL名: {0}", org["UrlName"]);
            Console.WriteLine("バージョン: {0}", org["Version"]);
        }

        // ユーザーが所属する組織一覧の取得
        HttpResponseMessage org8Res = await httpClient.GetAsync(serviceUrl + "Instances?$select=FriendlyName,Id&$filter=startswith(Version, '8')");
        JToken org8s = JObject.Parse(org8Res.Content.ReadAsStringAsync().Result)["value"];

        foreach (JToken org8 in org8s)
        {
            Console.WriteLine("フレンドリー名: {0}", org8["FriendlyName"]);
            Console.WriteLine("Id: {0}", org8["Id"]);                   
        }
    }
}

まとめ

ユーザーにプログラム実行先の組織を選択させたい場合や、組織の
詳細を動的に取得したい場合に有効です。

さて、こちらの記事が 2015 年最後の記事となりました。今年も 1 年間ご愛読いただき、
誠にありがとうございました。来年も引き続き少しでもお役に立てる記事を出せるよう
チーム全員精進して参りますので、よろしくお願いいたします。

よいお年を!

- 中村 憲一郎

※本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります