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

みなさん、こんにちは。

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

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

Web API では Upsert もサポートしています。Upsert の SDK サポート
は以下の記事をご覧ください。
Dynamics CRM Online 2015 Update 1 SDK 新機能: Upsert

Upsert で新規レコードの作成

まず Upsert を利用したレコードの作成を検証します。

プログラムの実装

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

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

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

3. Upsert を利用するにはレコードの GUID を指定する必要があります。
まずはまだ存在しないレコードを指定して、レコードが作成されるか
確認しましょう。以下のコードを新しく追加メソッド内に追加します。

// レコードの GUID
Guid newGuid = Guid.NewGuid();

// 取引先企業オブジェクトの作成
Account account = new Account();
account.name = "Upsert デモ";
account.telephone1 = "555-5555";

4. 送信するリクエストを作成します。以下コードを追加します。
HttpMethod には PATCH を利用します。

// 送信リクエストの作成
HttpRequestMessage request = new HttpRequestMessage(new HttpMethod("PATCH"), serviceUrl+ "accounts(" + newGuid + ")");
request.Content = new StringContent(JsonConvert.SerializeObject(account, new JsonSerializerSettings() { DefaultValueHandling = DefaultValueHandling.Ignore }));
               
request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");

5. 最後にリクエストを送信します。

// リクエストの送信
await httpClient.SendAsync(request);

6. 以下のコードを追加して、一旦画面を止めるようにします。

Console.WriteLine("レコードを作成しました。");
Console.Read();

動作確認

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

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

image

3. レコード作成のメッセージが表示されたら、レコードを作成されたか
ブラウザで確認します。

image

image

Upsert で既存レコードの更新

次に Upsert を利用したレコードの更新を検証します。

プログラムの実装

1 上記に続いて以下のコードを追加します。まずは取引先企業の
オブジェクトを作ります。Guid は作成で利用したものと同じ
ID を指定します。

// 取引先企業オブジェクトの作成
Account account2 = new Account();
account2.name = "Upsert デモ 更新しました";
account2.telephone1 = "555-5555";
account2.accountid = newGuid;

2. 次に送信リクエストを作成します。基本的には上記で作成
したものと同じです。

// 送信リクエストの作成
HttpRequestMessage request2 = new HttpRequestMessage(new HttpMethod("PATCH"), serviceUrl + "accounts(" + newGuid + ")");
request2.Content = new StringContent(JsonConvert.SerializeObject(account2, new JsonSerializerSettings() { DefaultValueHandling = DefaultValueHandling.Ignore }));

request2.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");

3. 最後にリクエストを送信します。

// リクエストの送信
await httpClient.SendAsync(request2);

4. レコードを更新したメッセージを表示します。

Console.WriteLine("レコードを更新しました。");

動作確認

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

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

3. レコードが作成された時点で一旦プログラムが停止します。ブラウザで
レコードをが追加されたことを確認します。

※ 1 行目は先ほど作成したレコードです。

image

4. プログラムに戻って、画面で Enter キーを押下します。

5. 以下のメッセージが出たタイミングでブラウザでレコードを更新された
ことを確認します。

image

image

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

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

        // レコードの GUID
        Guid newGuid = Guid.NewGuid();

        // 取引先企業オブジェクトの作成
        Account account = new Account();
        account.name = "Upsert デモ";
        account.telephone1 = "555-5555";

        // 送信リクエストの作成
        HttpRequestMessage request = new HttpRequestMessage(new HttpMethod("PATCH"), serviceUrl + "accounts(" + newGuid + ")");
        request.Content = new StringContent(JsonConvert.SerializeObject(account, new JsonSerializerSettings() { DefaultValueHandling = DefaultValueHandling.Ignore }));

        request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");

        // リクエストの送信
        await httpClient.SendAsync(request);

        Console.WriteLine("レコードを作成しました。");
        Console.Read();

        // 取引先企業オブジェクトの作成
        Account account2 = new Account();
        account2.name = "Upsert デモ 更新";
        account2.telephone1 = "555-5555";
        account2.accountid = newGuid;

        // 送信リクエストの作成
        HttpRequestMessage request2 = new HttpRequestMessage(new HttpMethod("PATCH"), serviceUrl + "accounts(" + newGuid + ")");
        request2.Content = new StringContent(JsonConvert.SerializeObject(account2, new JsonSerializerSettings() { DefaultValueHandling = DefaultValueHandling.Ignore }));

        request2.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");

        // リクエストの送信
        await httpClient.SendAsync(request2);

        Console.WriteLine("レコードを更新しました。");
    }
}

まとめ

Web API でも SDK 同様 Upsert が利用できるのは便利です。
是非お試しください!

- 中村 憲一郎