请求 URL 对于 fetchXml 查询类型来说太长

Request URL Too Long for fetchXml query types

我正在使用带有 fetchxml 查询参数的 CRM 2016 web api,但我的查询太长了,它模拟了 IN 运算符,IN 列表中传递的参数数量为 300 个元素,有时会不止于此。

所以我的问题是查询对于 GET HTTP 请求来说太大了。我已尝试在 http 消息正文中发送查询,但没有成功,那么这个问题的解决方案是什么?

这是我使用的 fetchxml 查询的代码片段:

<fetch mapping="logical" distinct="true">
   <entity name="entity">
      <attribute name="new_classopportunityid" />
      <attribute name="new_trainingproduct" />
      <attribute name="new_gtgstatus" />
      <attribute name="new_scheduledstartdate" />
      <attribute name="new_scheduledenddate" />
      <attribute name="new_remainingnumberofseats" />
      <attribute name="new_liveclassroom" />
      <attribute name="new_maxlive" />
      <attribute name="new_xavieruniversity" />
      <attribute name="new_partnerlive" />
      <attribute name="new_blended" />
      <filter>
         <condition attribute="new_classopportunityid" operator="in">
            <value>001943ea-e263-e611-8158-00155d002810</value>
            <value>0071e4ea-bd9b-e611-8163-00155d002810</value>
            <value>00c32774-1c8f-e611-8161-00155d002810</value>
            <value>00d513fa-f0bb-e611-8169-00155d002810</value>
            <value>....</value>
            <value>....</value>
            <value>....</value>
         </condition>
      </filter>
   </entity>
</fetch>

我请求的 CRM 网络 api 端点是:

 GET http://<org>/api/data/v8.0/<entity>?fetchXml=<fetch mapping="logical" distinct="true">
       <entity name="entity">
          <attribute name="new_classopportunityid" />
          <attribute name="new_trainingproduct" />
          <attribute name="new_gtgstatus" />
          <attribute name="new_scheduledstartdate" />
          <attribute name="new_scheduledenddate" />
          <attribute name="new_remainingnumberofseats" />
          <attribute name="new_liveclassroom" />
          <attribute name="new_maxlive" />
          <attribute name="new_xavieruniversity" />
          <attribute name="new_partnerlive" />
          <attribute name="new_blended" />
          <filter>
             <condition attribute="new_classopportunityid" operator="in">
                <value>001943ea-e263-e611-8158-00155d002810</value>
                <value>0071e4ea-bd9b-e611-8163-00155d002810</value>
                <value>00c32774-1c8f-e611-8161-00155d002810</value>
                <value>00d513fa-f0bb-e611-8169-00155d002810</value>
                <value>....</value>
                <value>....</value>
                <value>....</value>
             </condition>
          </filter>
       </entity>
    </fetch>

这是我从 api 得到的回复。

Error code: 414: HTTP/1.1 414 Request-URI Too Long  Response :  "<!DOCTYPE HTML PUBLIC \"-\/\/W3C\/\/DTD HTML 4.01\/\/EN\"\"http:\/\/www.w3.org\/TR\/html4\/strict.dtd\">\r\n<HTML><HEAD><TITLE>Request URL Too Long<\/TITLE>\r\n<META HTTP-EQUIV=\"Content-Type\" Content=\"text\/html; charset=us-ascii\"><\/HEAD>\r\n<BODY><h2>Request URL Too Long<\/h2>\r\n<hr><p>HTTP Error 414. The request URL is too long.<\/p>\r\n<\/BODY><\/HTML>\r\n" [] []

如您所见,使用带有大量 ID 的 "in" 运算符可能不是最好的查询方式。如果您可以使用 link-entity 过滤 new_classopportunity 实体的属性会更好,如下所示:

<fetch mapping="logical" distinct="true" >
  <entity name="entity" >
    <!-- ... all your attributes ... -->
    <link-entity name="new_classopportunity" from="new_classopportunityid" to="new_classopportunityid" >
      <attribute name="new_name" />
      <filter>
        <condition attribute="statecode" operator="eq" value="0" />
      </filter>
    </link-entity>
  </entity>
</fetch>

请注意,您也可以从 link-entity 中提取属性。在这种情况下,我使用名称并使用过滤器仅获取 new_classopportunity 个活动记录。

如果您在 new_classopportunity 上没有可以过滤以获得相同列表的字段,请添加一个! :)

您需要使用 Post,而不是 Get:

https://dreamingincrm.com/2017/01/15/executing-large-fetchxml-with-webapi/