Как можно расширить несколько полей в вызове Acumatica REST API?
/entity/Default/17.200.001/Customer?$expand=Contacts
работает, и
/entity/Default/17.200.001/Customer?$expand=Salespersons
работает, но
/entity/Default/17.200.001/Customer?$expand=Contacts,Salespersons
не делает, оставляя ни один из них расширенным.
Согласно документации Acumatica:
Интеграция->Работа с контрактным REST API->Параметры получения записей->$expand
они говорят, что следуют соглашениям OData (https://www.odata.org/documentation/odata-version-3-0/url-conventions/)
которого я считаю, что этот запрос придерживается.





Я спросил коллегу об этом поведении. Гипотеза состоит в том, что расширение нескольких запросов с помощью синтаксиса OData работает, но не может расширить более 1 массива сущностей. Я говорю «гипотеза», потому что ошибка веб-службы, возвращаемая при попытке расширить 2 массива сущностей, слишком общая, чтобы точно определить это как проблему.
Выпущенная в настоящее время документация, по-видимому, не затрагивает это ограничение, но вскоре она должна появиться вместе с обновленной документацией веб-сервиса. Обратите внимание, что это применимо только при извлечении всего объекта. Если бы вы выбрали один объект (например, выберите 1 клиента по идентификатору), вы могли бы расширить более 1 массива. Для одного объекта меньше ограничений, потому что меньше необходимости оптимизировать производительность для 1 по сравнению с X объектами.
Вы можете расширить несколько отдельных объектов и массив:
$expand=Contacts,MainContact,BillingContact
Но нельзя расширить несколько массивов:
$expand=Contacts,Salespersons
На левой панели экрана конечной точки веб-службы в виде дерева объект массива имеет обозначение массива [] (выделено красным на изображении ниже), а отдельный объект не имеет []:

Да, я знаю об этом, проблема возникает только при запросе всех клиентов. Расширение одного объекта имеет меньше ограничений. Это обычное явление для веб-сервисов. Неспособность вернуть данные чаще всего связана с преднамеренной попыткой ограничить количество отправляемых данных или время обработки для получения этих данных. Однако веб-служба должна была выдать тип ошибки «невозможно оптимизировать» в сценарии, с которым вы столкнулись.
Я добавил подробности о том, как это влияет только на получение нескольких объектов без ключа в моем ответе.
Возможные обходные пути:
1) Если требуется расширенный список всех Клиентов и всех полей
a) Write a Generic Inquiry
b) Make multiple calls, expanding only one list each time
2) Если количество клиентов довольно мало
a) Use the /Customer/{id}?$expand=... for each customers {id}
Преимущество (2a) заключается в том, что делегаты BQL поддерживаются, поскольку (1b) может получить ошибку «Просмотр ответов содержит делегат BQL». (1a), вероятно, требует наибольшей работы.
Это работает, когда конечная точка содержит идентификатор клиента, например /entity/Default/17.200.001/Customer/MYCUSTOMER?$expand=Contacts,Salespersons.