Это смелое заявление, но этот вопрос доказывает, что многие расширенные функции запросов не были полностью или должным образом реализованы в опубликованной службе.
Хотя многие разработчики могут использовать его для отработки концепций запросов OData, учитывая, что реализация OData в значительной степени зависит от разработчиков и версии используемых ими пакетов, это, вероятно, будет иметь большую коммерческую ценность, если вы будете запрашивать live< /em> или реализацию dev фактической службы, которую вы хотите запросить.
Ниже приведен анализ запросов OP и способы получения желаемого ответа в соответствии со спецификацией OData-V4 и проверка развернутого API, использующего следующие пакеты NuGet:
- Microsoft.AspNet.OData v7.3.0
- Microsoft.OData.Core v7.6.2
Фактический API, который я использовал для тестирования, является проприетарным и не может быть опубликован здесь.
- #P5#
https://services.odata.org/Experimental/Northwind/Northwind.svc/Customers?
$expand=Orders($expand=Order_Details($top=1))
#P25# #P6# #P7#
#P8# #P9# https://services.odata.org/Experimental/Northwind/Northwind.svc/Customers?
$expand=Orders($expand=Order_Details($orderby=ProductID;$top=1))
- #P10#
#P11#
https://services.odata.org/Experimental/Northwind/Northwind.svc/Customers?
$expand=Orders($expand=Order_Details;$filter=OrderID eq 10643)
&$filter=Orders/any(o:o/OrderID eq 10643)
#P12# https://services.odata.org/Experimental/Northwind/Northwind.svc/Customers?
$expand=Orders($expand=Order_Details;$filter=OrderID eq @orderId)
&$filter=Orders/any(o:o/OrderID eq @orderId)
&@orderId='10643'
#P26# #P13# #P27# #P14#
Причина, по которой ваш $expand
не работает, заключается в том, что вы пропустили $
в имени параметра. Интерпретатор запросов OData идентифицирует параметры запроса только как параметры, начинающиеся с $
. В любом случае, согласно https://services.odata.org/Experimental/Northwind/Northwind.svc/$metadata#Regions, нет свойства навигации Order_Details
для $expand
:
<EntitySet Name="Regions" EntityType="NorthwindModel.Region">
<NavigationPropertyBinding Path="Territories" Target="Territories" />
</EntitySet>
Итак, когда вы попытаетесь снова с правильным синтаксисом:
https://services.odata.org/Experimental/Northwind/Northwind.svc/Regions?$expand=Order_Details
вы получите ожидаемое сообщение:
Не удалось найти свойство с именем «OrderID» для типа «NorthwindModel.Region».
Вторая попытка сработает, если вы укажете правильный $
для параметра запроса $expand
: https://services.odata.org/Experimental/Northwind/Northwind.svc/Regions?$expand=Territories
Анализатор запросов OData ищет только ожидаемые параметры запроса с префиксом $
, что позволяет логике вашего API по-прежнему обрабатывать другие параметры, отличные от OData, по вашему усмотрению. Другие параметры для этого по-прежнему являются параметрами, совместимыми с URL-адресами HTTP, реализация на odata.org не знает, что с ними делать, и они просто игнорируются.
Это просто еще один вариант той же проблемы с 3, $
отсутствует. (Я подозреваю, что этот URL должен был быть в 3: https://services.odata.org/Experimental/Northwind/Northwind.svc/Products?$expand=Suppliers
)
Таким образом, хотя https://services.odata.org/Experimental/Northwind не на 100% надежен , так же как и реализации .Net ODataLib, SAP или MS Dynamics. Спецификация развивается, и есть много методов запросов, которые на данном этапе не полностью реализованы, вероятно, ни у одного поставщика.
Просто помните об этом факте, и когда вы столкнетесь с проблемами при использовании API, первой точкой контакта должны быть разработчики или сообщество, которые поддерживают этот конкретный API, разработчики будут решать, какие методы и пакеты они используют и в какой момент. конец дня, в какой степени они поддерживают протокол, как указано.
person
Chris Schaller
schedule
12.02.2020