Dynamics CRM Online 2015 Update 1 新機能: Web API 開発者プレビュー その 3
みなさん、こんにちは。
前回に引き続き Dynamics CRM Online 2015 Update 1 で提供される
Web API 開発者プレビューについて紹介します。連載記事になるため
第 1 回からご覧ください。
Web API 開発者プレビュー その 1
Web API 開発者プレビュー その 2
今回はレコード操作の基本となる作成、読み取り、更新、削除に
ついて説明します。
クラスの準備
この記事では、取引先企業レコードの操作を行いますので、まずは
取引先企業を表すクラスを追加します。
1. 前回作成した Visual Studio プロジェクトを開きます。
2. プロジェクトを右クリック | 追加 | 新しい項目よりクラスを
追加します。名前は Account.cs としました。
3. 追加した Account.cs ファイルを開き、以下コードに書き換えます。
using System;
namespace CrmWebAPITest
{
public class Account
{
public Guid accountid{ get; set; }
public string name { get; set; }
public string telephone1 { get; set; }
}
}
レコードの作成
まずレコードの作成部分を実装してみましょう。
プログラムの実装
1. Program.cs ファイルに以下の using ステートメントを追加します。
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
2. 次に取引先企業のオブジェクトを作成します。前回追加した Run
メソッドに以下のコードを追加します。
// 取引先企業オブジェクトの作成
Account account = new Account();
account.name = "Demo Account";
account.telephone1 = "555-5555";
3. 次に送信するリクエストを作成します。以下コードを追加します。
送信先アドレスは Web API エンドポイントに accounts を指定します。
また取引先企業オブジェクトは JSON にシリアライズします。
// 送信リクエストの作成
HttpRequestMessage createReq = new HttpRequestMessage(HttpMethod.Post, serviceUrl + "accounts");
createReq.Content = new StringContent(JsonConvert.SerializeObject(
account, new JsonSerializerSettings() { DefaultValueHandling = DefaultValueHandling.Ignore }));
createReq.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
4. 最後にリクエストを送信して、結果を画面に表示します。
// リクエストの送信と結果表示
HttpResponseMessage result = await httpClient.SendAsync(createReq);
Console.WriteLine(result.Headers.Location);
動作確認
1. F5 キーを押下してプログラムを実行します。
2. 認証ダイアログが表示されたらログインします。
3. 作成したレコードのアドレスが表示されます。
レコードの読み取り
次に作成したレコードを読み取ります。
プログラムの実装
1. 上記で追加したコードに続いて、以下のコードを追加します。
今回は作成時に取得したアドレスではなく、名前の検索を使い
レコードを取得してみます。
HttpResponseMessage retrieveRes = await httpClient.GetAsync(serviceUrl + "accounts?$filter=name eq 'Demo Account'");
2. 取得した結果を Account オブジェクトにデシリアライズします。
// 取得結果をデシリアライズ
JToken jToken = JObject.Parse(retrieveRes.Content.ReadAsStringAsync().Result)["value"];
Account forUpdate = JsonConvert.DeserializeObject<Account>(jToken[0].ToString());
Console.WriteLine("取引先企業 ID:{0} を取得しました。.", forUpdate.accountid);
動作確認
1. F5 キーを押下してプログラムを実行します。
2. 認証ダイアログが表示されたらログインします。
3. 結果が表示されます。
レコードの更新
次に読み取ったレコードを更新します。
プログラムの実装
1. 上記で追加したコードに続いて、以下のコードを追加して
取得したオブジェクトの名前プロパティを更新します。
forUpdate.name = forUpdate.name + " 更新しました!";
2. 以下のコードでレコード更新用の要求を作成します。
HttpMethod は PATCH を利用します。アドレスは
レコードを特定するため /api/data/accounts(guid) となります。
// 更新要求の作成
HttpRequestMessage updateReq = new HttpRequestMessage(new HttpMethod("PATCH"), serviceUrl + "accounts(" + forUpdate.accountid + ")");
updateReq.Content = new StringContent(JsonConvert.SerializeObject(forUpdate, new JsonSerializerSettings() { DefaultValueHandling = DefaultValueHandling.Ignore }));
updateReq.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
3. 作成した要求を送信します。
await httpClient.SendAsync(updateReq);
動作確認
1. F5 キーを押下してプログラムを実行します。
2. 認証ダイアログが表示されたらログインします。
3. 処理が完了したら、実際のレコードをブラウザで確認します。
レコードの削除
最後にレコードを削除します。
1. 削除要求を作成します。以下のコードを追加します。
HttpMethod は DELETE を利用します。アドレスは
レコードを特定するため /api/data/accounts(guid) となります。
// 削除要求の作成
HttpRequestMessage deleteReq = new HttpRequestMessage(HttpMethod.Delete, serviceUrl + "accounts(" + forUpdate.accountid + ")");
2. 以下のコードを追加して、要求を送信します。
await httpClient.SendAsync(deleteReq);
動作確認
1. F5 キーを押下してプログラムを実行します。
2. 認証ダイアログが表示されたらログインします。
3. 処理が完了したら、レコードが削除されたことをブラウザ
から確認します。
全てのコードを以下に示します。
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
namespace CrmWebAPITest
{
class Program
{
#region クラスレベルメンバー
static string serverUrl = "https://<CRM組織名>.crm7.dynamics.com";
static string authUrl = "https://login.windows.net/common";
static string clientId = "取得したIDを入力";
static string redirectUri = "https://localhost/webapipreview";
#endregion クラスレベルメンバー
public async Task Run(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);
// 取引先企業オブジェクトの作成
Account account = new Account();
account.name = "Demo Account";
account.telephone1 = "555-5555";
// 送信リクエストの作成
HttpRequestMessage createReq = new HttpRequestMessage(HttpMethod.Post, serviceUrl + "accounts");
createReq.Content = new StringContent(JsonConvert.SerializeObject(
account, new JsonSerializerSettings() { DefaultValueHandling = DefaultValueHandling.Ignore }));
createReq.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
// リクエストの送信と結果表示
HttpResponseMessage result = await httpClient.SendAsync(createReq);
Console.WriteLine(result.Headers.Location);
// 作成したレコードの取得
HttpResponseMessage retrieveRes = await httpClient.GetAsync(serviceUrl + "accounts?$filter=name eq 'Demo Account'");
// 取得結果をデシリアライズ
JToken jToken = JObject.Parse(retrieveRes.Content.ReadAsStringAsync().Result)["value"];
Account forUpdate = JsonConvert.DeserializeObject<Account>(jToken[0].ToString());
Console.WriteLine("取引先企業 ID:{0} を取得しました。.", forUpdate.accountid);
forUpdate.name = forUpdate.name + " 更新しました!";
// 更新要求の作成
HttpRequestMessage updateReq = new HttpRequestMessage(new HttpMethod("PATCH"), serviceUrl + "accounts(" + forUpdate.accountid + ")");
updateReq.Content = new StringContent(JsonConvert.SerializeObject(forUpdate, new JsonSerializerSettings() { DefaultValueHandling = DefaultValueHandling.Ignore }));
updateReq.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
await httpClient.SendAsync(updateReq);
Console.WriteLine("取引先企業を更新しました!");
// 削除要求の作成
HttpRequestMessage deleteReq = new HttpRequestMessage(HttpMethod.Delete, serviceUrl + "accounts(" + forUpdate.accountid + ")");
await httpClient.SendAsync(deleteReq);
Console.WriteLine("取引先企業を削除しました!");
}
}
static void Main(string[] args)
{
try
{
AuthenticationContext authContext = new AuthenticationContext(authUrl);
AuthenticationResult result = authContext.AcquireToken(serverUrl, clientId, new Uri(redirectUri));
Program app = new Program();
Task.WaitAll(Task.Run(async () => await app.Run(result.AccessToken)));
}
catch (System.Exception ex)
{
Console.WriteLine("エラーが発生しました。");
Console.WriteLine(ex.Message);
}
finally
{
Console.WriteLine("Press <Enter> to exit.");
Console.ReadLine();
}
}
}
}
まとめ
まずは基本となるレコードの作成、読み取り、更新、削除を
紹介しました。利用するアドレスや HttpMethod、および
JSON のシリアライズ/デシリアライズを再度ご確認ください。
次回は Upsert 機能の利用を紹介します。お楽しみに!
- 中村 憲一郎