Как получить правильные результаты для этих запросов?

  1. Необходимо выполнить и вернуть детали 1-го ордера отдельно для каждого ордера. Ниже не работает

https://services.odata.org/Experimental/Northwind/Northwind.svc/Customers?$expand=Заказы($expand=Order_Details;$top=1)

  1. Необходимо фильтровать записи на основе идентификатора заказа. Ниже не работает и выдает «Term 'Orders ($expand=Order_Details)$filter=OrderID eq '10643'' недействителен в выражении $select или $expand"

https://services.odata.org/Experimental/Northwind/Northwind.svc/Customers?$expand=Orders($expand=Order_Details)$filter=OrderID eq '10643'

  1. Недействительный, но возвращенные результаты

https://services.odata.org/Experimental/Northwind/Northwind.svc/Regions?expand=Order_Details https://services.odata.org/Experimental/Northwind/Northwind.svc/Regions?expand=Territories

  1. Невозвращающиеся дети

https://services.odata.org/Experimental/Northwind/Northwind.svc/Products?&expand=Suppliers https://services.odata.org/Experimental/Northwind/Northwind.svc/Regions?&expand=Territories


person Java Architect    schedule 05.02.2020    source источник


Ответы (1)


https://services.odata.org/Experimental/Northwind больше не является "наилучшей практикой"

Это смелое заявление, но этот вопрос доказывает, что многие расширенные функции запросов не были полностью или должным образом реализованы в опубликованной службе.

Хотя многие разработчики могут использовать его для отработки концепций запросов OData, учитывая, что реализация OData в значительной степени зависит от разработчиков и версии используемых ими пакетов, это, вероятно, будет иметь большую коммерческую ценность, если вы будете запрашивать live< /em> или реализацию dev фактической службы, которую вы хотите запросить.

Ниже приведен анализ запросов OP и способы получения желаемого ответа в соответствии со спецификацией OData-V4 и проверка развернутого API, использующего следующие пакеты NuGet:

  • Microsoft.AspNet.OData v7.3.0
  • Microsoft.OData.Core v7.6.2

Фактический API, который я использовал для тестирования, является проприетарным и не может быть опубликован здесь.

  1. #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))
    
  2. #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#
  3. Причина, по которой ваш $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 не знает, что с ними делать, и они просто игнорируются.

  4. Это просто еще один вариант той же проблемы с 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