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

みなさん、こんにちは。

前回に引き続き 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 開発者プレビュー その 7
Web API 開発者プレビュー その 8

今回は Web API でサポートするクエリを紹介します。

概要

Web API 開発者プレビューはこれまでに REST でサポートしたクエリ
以外に、以下のクエリをサポートします。

- $ref
- $count
- Not
- $value

早速順番に見ていきましょう。

$ref クエリ

$ref クエリを使うと、レコードの値ではなくレコードが取得できる
URI を取得できます。今回は取引先企業に紐づく取引先担当者の
レコード URI を取得してみます。

事前準備

事前に「Microsoft」という取引先企業レコードと、そのレコードに
関連する取引先担当者レコードを数件作成してください。

image

プログラムの実装

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

public async Task RunQueries(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.RunFormattedValue(result.AccessToken)));

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

3. 新しく追加した RunQueries メソッド内に以下のコードを追加して、
取引先企業の取得を実行します。

// 取引先企業の取得
HttpResponseMessage accountRes = await httpClient.GetAsync(serviceUrl + "accounts?$filter=startswith(name,'microsoft')");
JToken record = JObject.Parse(accountRes.Content.ReadAsStringAsync().Result)["value"][0];

4. 取得した取引先企業に紐づく取引先担当者レコードの URI を取得
して、表示します。以下のコードを追加します。

// $ref を利用した関連する取引先担当者の取得
HttpResponseMessage contactsRes = await httpClient.GetAsync(serviceUrl + "accounts(" + record["accountid"] + ")/contact_customer_accounts/$ref");

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

foreach (JToken contact in contacts)
{
    Console.WriteLine("取引先担当者の URI: {0}", contact["@odata.id"]);
}

動作確認

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

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

image

3. 以下のように取引先担当者の URI が表示されることを
確認します。

image

$count クエリ

$countクエリを使うと、レコードの件数を確認できます。

プログラムの実装

上記で追加したメソッドに以下のコードを追加して、取引先企業の
件数を取得します。※取得できる数は 5,000 件が上限です。

// $count を利用したデータの取得
HttpResponseMessage countRes = await httpClient.GetAsync(serviceUrl + "accounts?$count=true");
// 結果の表示
Console.WriteLine("取引先企業の数: {0}", JObject.Parse(countRes.Content.ReadAsStringAsync().Result)["@odata.count"]);

動作確認

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

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

3. 結果を確認します。

image

Not オペレーター

Not オペレーターを使うと、指定した条件と逆の結果を得られます。

プログラムの実装

上記で追加したメソッドに以下コードを追加して、名前が Microsoft
で始まらない取引先企業の件数を取得します。

// Not オペレーターを利用した取引先企業の検索
HttpResponseMessage notRes = await httpClient.GetAsync(serviceUrl + "accounts?$count=true&$filter=not(startswith(name, 'microsoft'))");
// 結果の表示
Console.WriteLine("Microsoft で始まらない取引先企業の件数: {0}", JObject.Parse(notRes.Content.ReadAsStringAsync().Result)["@odata.count"]);

動作確認

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

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

3. 結果を確認します。

image

$value クエリ

$value クエリを使うと、JSON データではなく値を直接取得できます。

プログラムの実装

上記で追加したメソッドに以下のコードを追加して、取引先企業の
名前を値で取得します。ポイントは OData のバージョンを明記する
ことです。尚、取引先企業の ID は上記で取得したものを再利用します。

結果の表示で JSON を処理していない点を確認してください。

// OData バージョンの指定
httpClient.DefaultRequestHeaders.Add("OData-MaxVersion", "4.0");
// $value を利用した取引先企業名前の取得
HttpResponseMessage varRes = await httpClient.GetAsync(serviceUrl + "accounts(" + record["accountid"] + ")/name/$value");
// 結果の表示
Console.WriteLine("取引先企業の名前: {0}", varRes.Content.ReadAsStringAsync().Result);

動作確認

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

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

3. 結果を確認します。

image

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

public async Task RunQueries(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);

        // 取引先企業の取得
        HttpResponseMessage accountRes = await httpClient.GetAsync(serviceUrl + "accounts?$filter=startswith(name,'microsoft')");
        JToken record = JObject.Parse(accountRes.Content.ReadAsStringAsync().Result)["value"][0];

        // $ref を利用した関連する取引先担当者の取得
        HttpResponseMessage contactsRes = await httpClient.GetAsync(serviceUrl + "accounts(" + record["accountid"] + ")/contact_customer_accounts/$ref");

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

        foreach (JToken contact in contacts)
        {
            Console.WriteLine("取引先担当者の URI: {0}", contact["@odata.id"]);
        }

        // $count を利用したデータの取得
        HttpResponseMessage countRes = await httpClient.GetAsync(serviceUrl + "accounts?$count=true");
        // 結果の表示
        Console.WriteLine("取引先企業の数: {0}", JObject.Parse(countRes.Content.ReadAsStringAsync().Result)["@odata.count"]);

        // Not オペレーターを利用した取引先企業の検索
        HttpResponseMessage notRes = await httpClient.GetAsync(serviceUrl + "accounts?$count=true&$filter=not(startswith(name, 'microsoft'))");
        // 結果の表示
        Console.WriteLine("Microsoft で始まらない取引先企業の件数: {0}", JObject.Parse(notRes.Content.ReadAsStringAsync().Result)["@odata.count"]);

        // OData バージョンの指定
        httpClient.DefaultRequestHeaders.Add("OData-MaxVersion", "4.0");
        // $value を利用した取引先企業名前の取得
        HttpResponseMessage varRes = await httpClient.GetAsync(serviceUrl + "accounts(" + record["accountid"] + ")/name/$value");
        // 結果の表示
        Console.WriteLine("取引先企業の名前: {0}", varRes.Content.ReadAsStringAsync().Result);
    }
}

まとめ

今回まで Web API プレビューの機能を HttpClient を利用して
紹介してきました。より生の HTTP リクエストに近い内容を
確認できるため参考になったのではないでしょうか。

次回は T4 テンプレートを利用した Web API の利用を紹介します。
お楽しみに!

- 中村 憲一郎