Dynamics CRM Online 2015 Update 1 新機能: Web API 開発者プレビュー その 7

みなさん、こんにちは。

前回に引き続き Dynamics CRM Online 2015 Update 1 で提供される
Web API 開発者プレビューについて紹介します。連載記事になるため
第 1 回からご覧ください。

Web API 開発者プレビュー その 1
Web API 開発者プレビュー その 2
Web API 開発者プレビュー その 3
Web API 開発者プレビュー その 4
Web API 開発者プレビュー その 5
Web API 開発者プレビュー その 6

今回は Web API を利用した Action と Function の機能を紹介します。

概要

Web API と REST エンドポイントの最大の違いは Action と Function
をサポートしていることです。これによりレコードの単純な作成、
読み取り、更新、削除だけでなく各種組織サービスも実行できます。

今回のバージョンではまだ全て組織サービスがサポートされては
いませんが、以下にいくつか紹介します。

Action の利用

普段よく使われる組織メッセージとして WhoAmI 要求を試します。

プログラムの実装

1 前回利用した Visual Studio ソリューションを開き、Program.cs
ファイルを開きます。新しく以下のメソッドを追加します。

public async Task RunActions(string accessToken)
{
    // HttpClient の作成
    using (HttpClient httpClient = new HttpClient())
    {
        // Web API アドレスの作成
        string serviceUrl = serverUrl + "/api/data/";
        // ヘッダーの設定
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

    }
}

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

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

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

3. 新しく追加した RunActions メソッド内に以下のコードを追加
して、WhoAmI を実行します。

// WhoAmI Action アドレスの作成と実行
HttpResponseMessage whoAmIRes = await httpClient.GetAsync(serviceUrl + "WhoAmI");

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

// 結果の表示
JToken jToken = JObject.Parse(whoAmIRes.Content.ReadAsStringAsync().Result);

Console.WriteLine("UserId: {0}", jToken["UserId"]);
Console.WriteLine("BusinessUnitId: {0}", jToken["BusinessUnitId"]);
Console.WriteLine("OrganizationId: {0}", jToken["OrganizationId"]);

動作確認

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

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

image

3. WhoAmI の結果が表示されることを確認します。

image

Function の利用

次に Function として、上記で取得した UserId をそのまま利用できる
RetrieveUserPrivileges を試します。

プログラムの実装

1. 上記に続いて、以下のコードを追加します。まず UserId を変数に
取得します。

// ユーザーID の取得
string userId = jToken["UserId"].ToString();

2. 次に Function を実行する要求を実行します。

// Function の実行
HttpResponseMessage retrieveUserPrivilegesRes = await httpClient.GetAsync(serviceUrl + "RetrieveUserPrivileges(UserId=" + userId + ")");

3. 最後の結果を表示するコードを追加します。

// 結果の表示
JToken privileges = JObject.Parse(retrieveUserPrivilegesRes.Content.ReadAsStringAsync().Result)["value"];

foreach (JToken privilege in privileges)
{
    Console.WriteLine("レベル: {0}, PrivilegeId: {1}", privilege["Depth"], privilege["PrivilegeId"]);
}

動作確認

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

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

3. RetrieveUserPrivileges の結果が表示されることを確認します。

image

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

public async Task RunActions(string accessToken)
{
    // HttpClient の作成
    using (HttpClient httpClient = new HttpClient())
    {
        // Web API アドレスの作成
        string serviceUrl = serverUrl + "/api/data/";
        // ヘッダーの設定
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

        // WhoAmI Action アドレスの作成と実行
        HttpResponseMessage whoAmIRes = await httpClient.GetAsync(serviceUrl + "WhoAmI");

        // 結果の表示
        JToken jToken = JObject.Parse(whoAmIRes.Content.ReadAsStringAsync().Result);

        Console.WriteLine("UserId: {0}", jToken["UserId"]);
        Console.WriteLine("BusinessUnitId: {0}", jToken["BusinessUnitId"]);
        Console.WriteLine("OrganizationId: {0}", jToken["OrganizationId"]);

        // ユーザーID の取得
        string userId = jToken["UserId"].ToString();

        // Function の実行
        HttpResponseMessage retrieveUserPrivilegesRes = await httpClient.GetAsync(serviceUrl + "RetrieveUserPrivileges(UserId=" + userId + ")");

        // 結果の表示
        JToken privileges = JObject.Parse(retrieveUserPrivilegesRes.Content.ReadAsStringAsync().Result)["value"];

        foreach (JToken privilege in privileges)
        {
            Console.WriteLine("レベル: {0}, PrivilegeId: {1}", privilege["Depth"], privilege["PrivilegeId"]);
        } 
    }
}

まとめ

Web API が Action と Function をサポートすることで、開発に
必要なすべての操作を行うことが出来るようになります。まだ
プレビューですが、基本的なコンセプトは変わりませんので、
是非お試しください!

- 中村 憲一郎