如何调用 Dynamics 365 OData 终结点以从 Delphi 获取用户列表

How to call the Dynamics 365 OData endpoint to get a list of users from Delphi

如果我通过网络浏览器验证到D365,然后输入以下内容URL:

https://mytenantcode.crmserver.dynamics.com/api/data/v8.2/systemusers? $select=systemuserid,lastname,firstname,title&$top=3

我可以用我请求的数据取回前 3 条记录。

我似乎能够按照 my other question(我回答的)在代码中对 D365 进行身份验证,并且有一个访问令牌,但我似乎无法确定如何设置 TRESTRequest 对象,以便执行工作。

目前,它总是 returns 一个 401 Unauthorized 错误。

我尝试将 TOAuth2Authenticator.AccessToken 属性 设置为我从 D365 收到的令牌,然后将 TRESTClient.Authenticator 属性 设置为 TOAuth2Authenticator TRESTQuest.ClientTRESTClient,这就是示例在 RESTDemos 项目中的工作方式,但我仍然得到 401.

这是我尝试过的代码的最后一个示例,假设所有 REST 对象都已正确链接,它应该可以工作:

  RESTClient.BaseURL := 'https://**mytenantcode**.**crmserver**.dynamics.com/api/data/v8.2/';

  RESTRequest.Method := TRESTRequestMethod.rmGET;
  RESTRequest.Resource := 'systemusers?$select={SELECT}&$top={TOP}';

  RESTRequest.AddParameter('SELECT', 'systemuserid,'+
                                      'lastname,'+
                                      'firstname,'+
                                      'title');
  RESTRequest.AddParameter('TOP', '3');

  RESTRequest.Execute;

我终于return使用以下代码调用网络API获得了正确的信息:

  RESTClient.BaseURL := 'https://mytenantcode.crmserver.dynamics.com/';

  RESTRequest.Resource := 'api/data/v8.2/systemusers?$select=int_staffnumber,'+
                                                            '_int_serviceareaid_value,'+
                                                            '_territoryid_value,'+
                                                            'lastname,'+
                                                            'firstname,'+
                                                            'systemuserid,'+
                                                            'title';

  RESTRequest.AddAuthParameter('Authorization', 'Bearer ' + AToken, TRESTRequestParameterKind.pkHTTPHEADER,
    [TRESTRequestParameterOption.poDoNotEncode]);

  RESTRequest.Execute;

重要的变化是添加了 Authorization header 参数,并且没有将 Params 用于查询参数,因为 REST 客户端库似乎实际上没有正确执行此操作。

还必须更改令牌授权的 ResourceURI 以匹配 https://mytenantcode.crmserver.dynamics.com URL 用于方法调用。