3

Я использую CRM 2016 веб-api с параметром запроса fetchxml, но мой запрос слишком длинный, он имитирует оператор IN, число параметров, переданных в списке IN, составляет 300 элементов, а некоторые раз больше.Request URL Too Long для типов запросов fetchXml

Так что моя проблема в том, что запрос слишком велик для запроса 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 Web 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> 

Это ответ, который я получил от апи.

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" [] [] 

ответ

3

Вы должны будете использовать пост, а не Get:

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

+0

Я попытался использовать пост в конечной точке объекта, но это REST, и это означает, что сущность не получит сущность, я проверю адрес, который вы отправили. Спасибо –

+0

Да! Я только что видел это вчера и хотел опубликовать его в качестве ответа на мой ответ. Хорошая находка. –

+0

Спасибо, мужчина, ваш код спас мою жизнь –

1

Использование «в» оператор с большим списком идентификаторов, вероятно, не самый лучший способ запроса, как вы уже видели. Было бы лучше, если бы вы могли фильтровать атрибут new_classopportunity объекта с помощью link-entity, например:

<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, которое вы можете фильтровать по своему дате, добавьте его! :)

+0

Я не знаю, что это ссылка на сущность, но кажется, что вы предлагаете использовать запрос диапазона (т. е. между x1 и x2, но x1, а x2 не является целым, это строка GUID). –

+0

Он похож на INNER JOIN в SQL. Вы занимаетесь всеми вашими данными о сущности и присоединяетесь к ним в соответствующем объекте. Вы можете отфильтровать этот объект-связку, поэтому конечным результатом будет список записей ваших основных сущностей, имеющих соответствующие записи new_classopportunity. Таким образом, вы не передаете большой список идентификаторов - вы передаете фильтр, который будет возвращать те же идентификаторы в сущности-ссылке. –

+0

К сожалению, я не могу избавиться от длинного списка идентификаторов. –