Freigeben über


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 としました。

image

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. 認証ダイアログが表示されたらログインします。

image

3. 作成したレコードのアドレスが表示されます。

image

レコードの読み取り

次に作成したレコードを読み取ります。

プログラムの実装

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. 結果が表示されます。

image

レコードの更新

次に読み取ったレコードを更新します。

プログラムの実装

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. 処理が完了したら、実際のレコードをブラウザで確認します。

image

レコードの削除

最後にレコードを削除します。

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 機能の利用を紹介します。お楽しみに!

- 中村 憲一郎