Как получить правильные результаты для этих запросов? - PullRequest
1 голос
/ 05 февраля 2020
  1. Необходимо выполнить и вернуть детали 1-го заказа отдельно для каждого заказа. Ниже не работает

https://services.odata.org/Experimental/Northwind/Northwind.svc/Customers? $ Expand = Orders ($ expand = Order_Details; $ top = 1)

Необходимо отфильтровать записи на основе идентификатора заказа. Ниже не работает и выдает «Срок» заказов ($ 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'

Неверные, но возвращенные результаты

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

Не вернувшиеся дети

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

1 Ответ

0 голосов
/ 12 февраля 2020

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

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

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

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

  • Microsoft.As pNet .OData v7.3.0
  • Microsoft.OData. Core v7.6.2

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

  1. Согласно спецификации c, вы должны переместить спецификатор $top в расширение Order_Details.

    https://services.odata.org/Experimental/Northwind/Northwind.svc/Customers? 
                                     $expand=Orders($expand=Order_Details($top=1))
    

    Однако:

    https://services.odata.org/Experimental/Northwind неправильно реализует параметр запроса $top в расширении, как определено в 5.1.3 Параметр системного запроса $ expand

    Параметры запроса можно применить к расширенному свойству навигации, добавив разделенный точкой с запятой список параметров запроса, заключенный в скобки, к имени свойства навигации. Допустимые параметры системного запроса: $filter, $select, $orderby, $skip, $top, $count, $search и $expand.

    Однако $top поддерживается в реализации ODataLib v7 + (. Net) OData v4. Таким образом, синтаксис правильный, но вам следует узнать мнение ваших разработчиков API, если ваши запросы с этим синтаксисом не работают.

    ПРИМЕЧАНИЕ: При использовании $top вы также должны использовать $orderby, чтобы обеспечить надежность и воспроизводимость результатов запроса:

    https://services.odata.org/Experimental/Northwind/Northwind.svc/Customers? 
                         $expand=Orders($expand=Order_Details($orderby=ProductID;$top=1))
    
  2. Чтобы применить несколько параметров запроса в расширение, вы должны отделить его точкой с запятой: ;. Однако это само по себе не помешает возвращению других записей о клиентах, поэтому необходимо также добавить фильтр уровня root, что усложняется тем фактом, что Orders является коллекцией. Мы можем использовать функцию any, чтобы возвращать только клиентов, у которых есть заказ с указанным идентификатором:

    Также обратите внимание, что OrderID - это число c, поэтому не заключайте значения сравнения в кавычки

    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)
    

    это можно еще более упростить, используя псевдоним параметра:

    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'
    

    Однако:

    https://services.odata.org/Experimental/Northwind неправильно реализует псевдонимы параметров , поэтому вы не можете проверить синтаксис псевдонимов для этой службы.

    Также обратите внимание

    , что экспериментальная служба не применяет правильно фильтр для root элементов или коллекции навигации, однако приведенный здесь синтаксис работает против. Net реализаций ODataLib OData v4.

  3. Причина, по которой ваш $expand не работает, заключается в том, что вы исключили $ из имени параметра. Интерпретатор запросов OData определяет только параметры запроса, параметры которых начинаются с $. В любом случае, в соответствии с https://services.odata.org/Experimental/Northwind/Northwind.svc/ $ metadata # Regions, отсутствует Order_Details свойство навигации для $expand on:

    <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 c по-прежнему обрабатывать другие не-OData параметры, как вы считаете нужным. Другие параметры по-прежнему являются параметрами, соответствующими HTTP Url, реализация 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. Спецификация c развивается, и есть много методов запросов, которые не полностью реализованы, вероятно, в каких-либо провайдерах на данном этапе.

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

...