1. 記事一覧 >
  2. ブログ記事
Dataverse
category logo

Postmanを使ってMicrosoft Dataverse Web APIで部署を追加

(更新) (公開)

はじめに

前回(「【MSAL】Dataverse Web API で追加・更新・削除・画像アップロード・画像ダウンロード」)では、JavaScript によるトークン取得、Microsoft Dataverse Web API へのリクエストをやりましたが、今回、Postman を Windows10 にインストールして、ノーコーディングで、API リクエストを行いました。
Postman にて、前回と同じことが可能なのですが、今回は、Postman インストール~部署作成、削除までをゴールとします。

PostmanでAPIリクエストする人は、部署 作成権限のある管理者とします。

【 部署 】

ここで言う "部署" は、Dynamics 365(Dynamics CRM) の部署で、Dataverse の 部署 テーブル( businessunit テーブル)のレコードの事です。

【 Postman 】

Postmanは、開発者がAPIを設計、構築、テスト、反復するためのAPIプラットフォームです。

【 検証環境 】

Windows 10 Pro x64

Postman for Windows Version 10.0.35

他、Dataverse等の状況は、2022年10月現在の状況を元にしています。


Postman インストール

https://www.postman.com/downloads/ から Postman をダウンロードします。 Postmanをダウンロード1


Postmanをダウンロード2


Postman-win64-Setup.exe を起動して、インストールします。


Create Free Account にて、アカウントを作成します。 Create Free Account

以降、アカウント作成のところは、省略し、サインインしたところからとします。


Azure AD アプリの登録

Postman の作業の前に、

Azure Active Directoryアプリの登録+ 新規登録 をクリックします。 アプリの登録 新規登録


名前Postman Dataverse(任意)
サポートされているアカウントの種類この組織ディレクトリのみに含まれるアカウント (<テナント名> のみ - シングル テナント)
リダイレクト URI (省略可能)パブリック クライアント/ネイティブ (モバイルとデスクトップ) https://oauth.pstmn.io/v1/callback
とします。

Postman Dataverse アプリ登録


アプリケーション (クライアント) IDディレクトリ (テナント) ID をメモします。後で、Postman の準備をするときに必要になります。 アプリケーション (クライアント) ID ディレクトリ (テナント) ID


API のアクセス許可アクセス許可の追加 をクリックします。 アクセス許可の追加


Dynamics CRM をクリックします。 Dynamics CRM


アクセス許可 のところの user_impersonation にチェックを入れて、アクセス許可の追加 をクリックします。 user_impersonation


アクセス許可の追加 結果


ここまでで、Azure 側の作業は終わりです。

証明書とシークレットクライアントシークレット を使って、人の代わりにアプリケーションの権限で API 実行できますが、今回は、管理者がサインインを行います。


Postman 準備

WorkspacesCreate Workspace をクリックし、Test Workspace を作成します。

Create Workspace1


Create Workspace2

My Workspace でも良いですが、ここでは、専用のWorkspaceで作業していくものとします。


Create Collection をクリックし、New Collection を作成します。 Create Collection

New Collection は任意の名称に変えられますが、そのままとします。

【 Workspaces 】

Collection の集まりをまとめる箱のようなものです。

【 Collection 】

APIリクエスト(URL、パラメータ)のひな形集のようなものです。


Authorization タブ、Type のところを OAuth 2.0 とします。
OAuth 2.0 選択


Authorization タブ、Configure New Token (下の方)のところを以下のように入力します。


Token NamePostman Dataverse(任意)
Grant TypeAuthorization Code (With PKCE)
Callback URLhttps://oauth.pstmn.io/v1/callback
Auth URLhttps://login.microsoftonline.com/0c6c0***-****-****-****-*******d0d2b/oauth2/v2.0/authorize
Access Token URLhttps://login.microsoftonline.com/0c6c0***-****-****-****-*******d0d2b/oauth2/v2.0/token
Client ID3b43e***-****-****-****-*******914d8
Scopehttps://***********.api.crm*.dynamics.com/.default


この記事を書いていたときは必要なかったのですが、2022年12月に Postman v10.6.7 にアップデートされて、Client Authentication のところを Send client credentials in body にする手順が必要になりました。


0c6c0***-****-****-****-*******d0d2b のところは、Azure Active Directory アプリの登録でメモした ディレクトリ (テナント) ID です。
Client ID の入力値は、Azure Active Directory アプリの登録でメモした アプリケーション (クライアント) ID です。
Scope の https://***********.api.crm*.dynamics.com/ 部分は、
[Organization URI] です。
Power Apps 右上の歯車 → 開発者リソース → Web API エンドポイント に表示される URL です。

右上歯車


開発者リソース

Client ID 等は、環境変数に登録して、{{clientid}} のように変数で書くのが推奨されますが、今回は、直書きです。


Get New Access Token をクリックします。

Get New Access Token


サインインします。
サインイン


承諾 をクリックします。(初めてサインインしたときだけアクセス許可を聞かれます。) 承諾


Proceed をクリックします。 Proceed


Use Token をクリックします。 Use Token


トークンが入力されていると準備完了です。 トークンが入力されている


Save をクリックして、Collection を保存します。 Save

保存し忘れると、この後の GET でこのトークンの設定が引き継がれず、401 エラーが返ります。

Save は、画面が十分に広い場合、アイコンで表示されます。


GET 動作確認

動作確認として、とりあえず、取引先企業 テーブル( account テーブル)の内容を API で GET してみることにします。


Add a request をクリックします。
Add a request


GEThttps://***********.api.crm*.dynamics.com/api/data/v9.2/accounts
とします。


https://***********.api.crm*.dynamics.com/ 部分は、先ほど説明があった [Organization URI] です。
accounts は、テーブル名 account の複数形です。このケースに限らず、テーブル名は常に複数形で書かないとエラーになります。

リクエストの名前を設定できますが、とりあえず、New Request のままで進めています。


Send をクリックします。

Send


OK!


POST 部署作成

部署を作成します。
部署を作成するときは、必ず、親部署の指定が必要です。
必ず、ルート部署が1つ有り、今回、これを親部署とします。ルート部署と同格の部署は作成できません。

ルート部署が1つ有り、今回、これを親部署とする


まず、 GEThttps://***********.api.crm*.dynamics.com/api/data/v9.2/businessunits
部署 テーブル( businessunit テーブル)の内容を出力し、ルート部署の businessunitid を確認しておきます。(Power Apps - Dataverse 画面でも確認できます。) ルート部署の businessunitid を確認


判明した businessunitid は、
b982d***-****-****-****-*******27069 とします。


Body タブをクリックして、raw ラジオボタンをクリック、JSON を選択します。

JSON 選択


POSThttps://***********.api.crm*.dynamics.com/api/data/v9.2/businessunits
に変更して、 下記内容を入力します。

{
  "parentbusinessunitid@odata.bind": "/businessunits(b982d***-****-****-****-*******27069)",
  "name": "NewBU"
}

Send ボタンをクリックして、204 No Content が返れば、成功です。

POST 204 No Content


Power Apps - Dataverse → テーブル部署 を確認すると、追加されています。

Power Apps - Dataverse 部署追加確認1


Power Apps - Dataverse 部署追加確認2


OK!!


DELETE 部署削除

先ほど作成した部署を削除します。
部署を削除するときは、事前に isdisabled を true にする必要があります。


まず、
GEThttps://***********.api.crm*.dynamics.com/api/data/v9.2/businessunits
部署 テーブル( businessunit テーブル)の内容を出力し、先ほど作成した部署 "NewBU" の businessunitid を確認しておきます。(Power Apps - Dataverse 画面でも確認できます。) NewBU の businessunitid を確認


判明した businessunitid は、
654b8***-****-****-****-*******279c8 とします。


PATCHhttps://***********.api.crm*.dynamics.com/api/data/v9.2/businessunits(654b8***-****-****-****-*******279c8)
に変更して、 Body タブ入力欄に下記内容を入力します。

{
  "isdisabled": true
}

Send ボタンをクリックして、204 No Content が返れば、成功です。

PATCH 204 No Content


Power Apps - Dataverse → テーブル部署NewBU を確認すると、無効にする 列( isdisabled 列)が "はい" になっています。

無効にする 列(isdisabled 列)


DELETEhttps://***********.api.crm*.dynamics.com/api/data/v9.2/businessunits(654b8***-****-****-****-*******279c8)
に変更して、Send ボタンをクリックします。

DELETE 204 No Content


204 No Content が返れば、成功です。
Power Apps - Dataverse → テーブル部署 から NewBU が消えているはずです。


Voila!


トラブルシューティング

現象:トークンが取得できない。
トークンが取得できない


エラーAuthentication failed
Couldn’t complete authentication. Check the Postman Console for more details.


Postman ConsoleError: [object Object]

【 Postman Console 】

Ctrl+Alt+C で開きます。macOSの場合は、⌘+Option+C です。


原因:Grant Type が間違っている。(Implicitになっていたり。)




現象:トークンが取得できない。
トークンが取得できない


エラーAuthentication failed
Couldn’t complete authentication. Check the Postman Console for more details.


Postman ConsoleError: AADSTS9002327: Tokens issued for the 'Single-Page Application' client-type may only be redeemed via cross-origin requests.
あるいは、
Error: AADSTS7000218: The request body must contain the following parameter: 'client_assertion' or 'client_secret'.


原因:Azure Active Directory アプリの登録の手順で、パブリック クライアント/ネイティブ (モバイルとデスクトップ) 以外の Webシングルページアプリケーション などを選択している。




現象:トークンが取得できない。(サインイン中に問題が発生)
サインイン中に問題が発生


エラー申し訳ありませんが、サインイン中に問題が発生しました。
AADSTS50011: The redirect URI 'https://oauth.pstmn.io/v1/callback' specified in the request does not match the redirect URIs configured for the application '3b43e***-****-****-****-*******914d8'. Make sure the redirect URI sent in the request matches one added to your application in the Azure portal. Navigate to https://aka.ms/redirectUriMismatchError to learn more about how to fix this.


原因:リダイレクト URI(Azure AD - アプリの登録 - 認証)が間違っている。




現象GET https://***********.api.crm*.dynamics.com/api/data/v9.2/account404 Not Found


エラー"code": "0x8006088a",
"message": "Resource not found for the segment 'account'."


原因:テーブル名を複数形にしていない。
誤:account
正:accounts




現象POST https://***********.api.crm*.dynamics.com/api/data/v9.2/businessunits415 Unsupported Media Type


エラー"code": "0x8006088a",
"message": "POST request requires Content-Type application/json."


原因:JSON を選択していない。 JSON を選択




現象POST https://***********.api.crm*.dynamics.com/api/data/v9.2/businessunits400 Bad Request


エラー"code": "0x80041d35",
"message": "Only one organization and one root business are allowed."


原因:親部署を指定していない。




現象POST https://***********.api.crm*.dynamics.com/api/data/v9.2/businessunits400 Bad Request


エラー"code": "0x0",
"message": "Error identified in Payload provided by the user for Entity :'businessunits', For more information on this error please follow this help link https://go.microsoft.com/fwlink/?linkid=2195293 ----> InnerException : Microsoft.OData.ODataException: A 'PrimitiveValue' node with non-null value was found when trying to read the value of the property 'parentbusinessunitid'; however, a 'StartArray' node, a 'StartObject' node, or a 'PrimitiveValue' node with null value was expected.


原因:親部署の指定の仕方が間違っている。
誤:"parentbusinessunitid": "b982d***-****-****-****-*******27069",
正:"parentbusinessunitid@odata.bind": "/businessunits(b982d***-****-****-****-*******27069)",




現象POST https://***********.api.crm*.dynamics.com/api/data/v9.2/businessunits404 Not Found


エラー"code": "0x80040217",
"message": "BusinessUnit With Id = b982d***---****-*******270aa Does Not Exist"


原因:親部署の ID が間違っている。




現象DELETE https://***********.api.crm*.dynamics.com/api/data/v9.2/businessunits(654b8***-****-****-****-*******279c8)400 Bad Request


エラー"code": "0x80041d60",
"message": "Not disabled business unit cannot be deleted."


原因:削除しようとしている部署の isdisabled 列 が false になっている。




現象DELETE https://***********.api.crm*.dynamics.com/api/data/v9.2/businessunits(654b8***-****-****-****-*******279c8)400 Bad Request


エラー"code": "0x80041d61",
"message": "Business unit has a child business unit and cannot be deleted."


原因:子部署があるため、削除できない。(末端から削除が必要)




現象401 Unauthorized


原因:トークンの時間切れの可能性があります。(Get New Access Token ボタンで取得しなおせば、OK)

https://learn.microsoft.com/ja-jp/power-apps/developer/data-platform/authenticate-oauthに「token が 1 時間以内に期限切れになる」という記述があります。




loading...