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」という取引先企業レコードと、そのレコードに
関連する取引先担当者レコードを数件作成してください。
プログラムの実装
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. 認証ダイアログが表示されたらログインします。
3. 以下のように取引先担当者の URI が表示されることを
確認します。
$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. 結果を確認します。
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. 結果を確認します。
$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. 結果を確認します。
今回追加したメソッドを以下に示します。
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 の利用を紹介します。
お楽しみに!
- 中村 憲一郎