如何使用 Web return 来自 Dynamics 365 的 50 多个结果 API

How to return more than 50 results from Dynamics 365 using the Web API

继续我的 Delphi 项目中的 Dynamics 365,我现在需要从 CRM 检索比我默认可以获得的 50 个实体更多的数据,并且通过设置maxpagesize 偏好,我应该可以得到更多。

这是我现有的 Delphi 从 Dynamics 检索数据的代码:

  RESTClient.BaseURL := 'https://mytest.api.crm6.dynamics.com';
  RESTRequest.Resource := 'XRMServices/2011/OrganizationData.svc/AccountSet?$select=Name&';
  RESTRequest.Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8';
  RESTRequest.Execute;

这 return 的 50 个结果,然后是分页标签(我们现在将忽略它):

<link rel="next" href="https://mytest.api.crm6.dynamics.com/XRMServices/2011/OrganizationData.svc/AccountSet?$select=Name&amp;$skiptoken=1,'accountid','%7BE5752F29-1E8E-E811-8182-E0071B662BF1%7D','%7B700C44F2-BF8F-E811-8191-E0071B659EC1%7D'" />

https://msdn.microsoft.com/en-us/library/gg334767.aspx#bkmk_specifyNumber

根据上面的 MS 文档,将实体数指定为 return 的请求如下所示:

GET [Organization URI]/api/data/v8.2/accounts?$select=name HTTP/1.1
Accept: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
Prefer: odata.maxpagesize=3

我遇到的麻烦是如何指定 Prefer: odata.maxpagesize=nnn

这些是我尝试过的东西:

  RESTClient.AddParameter('Prefer', 'odata.maxpagesize=250',TRESTRequestParameterKind.pkHTTPHEADER,
    [TRESTRequestParameterOption.poDoNotEncode]);

  RESTRequest.AddAuthParameter('Prefer', 'odata.maxpagesize=250',TRESTRequestParameterKind.pkHTTPHEADER,
    [TRESTRequestParameterOption.poDoNotEncode]);

  RESTRequest.Params.AddItem('Prefer', 'odata.maxpagesize=250',TRESTRequestParameterKind.pkHTTPHEADER,
    [TRESTRequestParameterOption.poDoNotEncode]);

  RESTRequest.Params.AddHeader('Prefer', 'odata.maxpagesize=250');

None 的工作。我仍然得到 50 个实体。

有没有其他人成功使用 Delphi 10.2 的 Dynamics 365 Web API,或者我是唯一一个?

您正在使用错误的端点,您正在呼叫

https://org/XRMServices/2011/OrganizationData.svc/AccountSet

你应该打电话给:

https://org/api/data/v8.2/accounts

这很重要,因为第一个已弃用,您将始终在那里获得 50 行(这可以使用 PowerShell 命令更改,如 here 所述)

使用第二个 url(因此实际上支持页面大小的新 WebAPI)最后一个选项应该有效:

RESTRequest.Params.AddHeader('Prefer', 'odata.maxpagesize=250');