Функции WebAPI и OData

Я использую webapi для получения данных. API ограничивает результаты до 100. В данном случае их 2481, но из-за этого ограничения я не могу получить все необходимые записи без использования функций OData. Мне сказали использовать функцию пропуска, но документация по ней не очень полезна для тех, кто не использовал ее раньше.

Мой призыв таков:

    https://accounting.sageone.co.za/api/2.0.0/TaxInvoice/get?apikey = {xxxxxxxxxx}&companyid=12345&includeDetail=true&$orderby=Created%20desc

Ниже приведен фрагмент первого полученного результата:

> {
>     "TotalResults": 2481,
>     "ReturnedResults": 100,
>     "Results": [
>         {
>             "DueDate": "2018-10-31T00:00:00Z",
>             "FromDocument": "",
>             "AllowOnlinePayment": true,
>             "Paid": false,
>             "Status": "Unpaid",
>             "Locked": false,
>             "CustomerId": 3148838,
>             "CustomerName": "Cell C Limited",
>             "SalesRepresentativeId": 37307,
>             "SalesRepresentative": {
>                 "ID": 37307,
>                 "FirstName": "David",
>                 "LastName": "Markman",
>                 "Name": "David Markman",
>                 "Active": true,
>                 "Email": "[email protected]",
>                 "Mobile": "",
>                 "Telephone": "",
>                 "Created": "2018-10-18T12:42:31.233",
>                 "Modified": "2018-10-18T12:46:49.01"
>             },
>             "Modified": "2018-10-18T12:46:49.01",
>             "Created": "2018-10-18T12:42:31.233",
>             "ID": 483959431,
>             "Date": "2018-10-18T00:00:00Z",
>             "Inclusive": false,
>             "DiscountPercentage": 0,
>             "TaxReference": "4870194356",
>             "DocumentNumber": "INV03357",
>             "Reference": "14480 - October Print & Post",
>             "Message": "",
>             "Discount": 0,
>             "Exclusive": 98243.04,
>             "Tax": 14736.46,
>             "Rounding": 0,
>             "Total": 112979.5,
>             "AmountDue": 112979.5,
>             "PostalAddress01": "Cell C ",
>             "PostalAddress02": "Waterfall Campus",
>             "PostalAddress03": "C/O Maxwell Drive and Pretoria Road",
>             "PostalAddress04": "Buccleuch",
>             "PostalAddress05": "",
>             "DeliveryAddress01": "September 2018 Print & Post Distribution",
>             "DeliveryAddress02": "",
>             "DeliveryAddress03": "",
>             "DeliveryAddress04": "",
>             "DeliveryAddress05": "PO: TBC",
>             "Printed": true,
>             "Editable": true,
>             "HasAttachments": false,
>             "HasNotes": false,
>             "HasAnticipatedDate": false,
>             "Lines": [
>                 {
>                     "SelectionId": 4804411,
>                     "TaxTypeId": 2691481,
>                     "ID": 328907379,
>                     "Description": "CELL C PRINT & POST ",
>                     "LineType": 0,
>                     "Quantity": 1,
>                     "UnitPriceExclusive": 0,
>                     "Unit": "",
>                     "UnitPriceInclusive": 0,
>                     "TaxPercentage": 0.15,
>                     "DiscountPercentage": 0,
>                     "Exclusive": 0,
>                     "Discount": 0,
>                     "Tax": 0,
>                     "Total": 0,
>                     "Comments": "",
>                     "AnalysisCategoryId1": 16041,
>                     "UnitCost": 0
>                 },
>                 {
>                     "SelectionId": 12926677,
>                     "TaxTypeId": 2691481,
>                     "ID": 328907380,
>                     "Description": "CellC: PDF Compiled",
>                     "LineType": 0,
>                     "Quantity": 52926,
>                     "UnitPriceExclusive": 0.34,
>                     "Unit": "",
>                     "UnitPriceInclusive": 0.39,
>                     "TaxPercentage": 0.15,
>                     "DiscountPercentage": 0,
>                     "Exclusive": 17994.84,
>                     "Discount": 0,
>                     "Tax": 2699.23,
>                     "Total": 20694.07,
>                     "Comments": "",
>                     "AnalysisCategoryId1": 16041,
>                     "UnitCost": 0
>                 },
>                 {
>                     "SelectionId": 12926854,
>                     "TaxTypeId": 2691481,
>                     "ID": 328907382,
>                     "Description": "CellC: Rounding Difference",
>                     "LineType": 0,
>                     "Quantity": 1,
>                     "UnitPriceExclusive": -238.16,
>                     "Unit": "",
>                     "UnitPriceInclusive": -273.88,
>                     "TaxPercentage": 0.15,
>                     "DiscountPercentage": 0,
>                     "Exclusive": -238.16,
>                     "Discount": 0,
>                     "Tax": -35.72,
>                     "Total": -273.88,
>                     "Comments": "",
>                     "AnalysisCategoryId1": 16041,
>                     "UnitCost": 0
>                 },
>                 {
>                     "SelectionId": 12926687,
>                     "TaxTypeId": 2691481,
>                     "ID": 328907383,
>                     "Description": "CellC: PDF Print",
>                     "LineType": 0,
>                     "Quantity": 109782.5,
>                     "UnitPriceExclusive": 0.73,
>                     "Unit": "",
>                     "UnitPriceInclusive": 0.83,
>                     "TaxPercentage": 0.15,
>                     "DiscountPercentage": 0,
>                     "Exclusive": 80141.23,
>                     "Discount": 0,
>                     "Tax": 12021.18,
>                     "Total": 92162.41,
>                     "Comments": "",
>                     "AnalysisCategoryId1": 16041,
>                     "UnitCost": 0
>                 },
>                 {
>                     "SelectionId": 12926854,
>                     "TaxTypeId": 2691481,
>                     "ID": 328907384,
>                     "Description": "CellC: Rounding Difference",
>                     "LineType": 0,
>                     "Quantity": 1,
>                     "UnitPriceExclusive": -87.82,
>                     "Unit": "",
>                     "UnitPriceInclusive": -100.99,
>                     "TaxPercentage": 0.15,
>                     "DiscountPercentage": 0,
>                     "Exclusive": -87.82,
>                     "Discount": 0,
>                     "Tax": -13.17,
>                     "Total": -100.99,
>                     "Comments": "",
>                     "AnalysisCategoryId1": 16041,
>                     "UnitCost": 0
>                 },
>                 {
>                     "SelectionId": 12926687,
>                     "TaxTypeId": 2691481,
>                     "ID": 328907385,
>                     "Description": "CellC: Hand Delivery",
>                     "LineType": 0,
>                     "Quantity": 2,
>                     "UnitPriceExclusive": 0.34,
>                     "Unit": "",
>                     "UnitPriceInclusive": 0.39,
>                     "TaxPercentage": 0.15,
>                     "DiscountPercentage": 0,
>                     "Exclusive": 0.68,
>                     "Discount": 0,
>                     "Tax": 0.1,
>                     "Total": 0.78,
>                     "Comments": "",
>                     "AnalysisCategoryId1": 16041,
>                     "UnitCost": 0
>                 },
>                 {
>                     "SelectionId": 12926854,
>                     "TaxTypeId": 2691481,
>                     "ID": 328907386,
>                     "Description": "CellC: Rounding Difference",
>                     "LineType": 0,
>                     "Quantity": 1,
>                     "UnitPriceExclusive": -0.01,
>                     "Unit": "",
>                     "UnitPriceInclusive": -0.01,
>                     "TaxPercentage": 0.15,
>                     "DiscountPercentage": 0,
>                     "Exclusive": -0.01,
>                     "Discount": 0,
>                     "Tax": 0,
>                     "Total": -0.01,
>                     "Comments": "",
>                     "AnalysisCategoryId1": 16041,
>                     "UnitCost": 0
>                 },
>                 {
>                     "SelectionId": 12926761,
>                     "TaxTypeId": 2691481,
>                     "ID": 328907387,
>                     "Description": "CellC: Nixie",
>                     "LineType": 0,
>                     "Quantity": 1,
>                     "UnitPriceExclusive": 432.28,
>                     "Unit": "",
>                     "UnitPriceInclusive": 497.12,
>                     "TaxPercentage": 0.15,
>                     "DiscountPercentage": 0,
>            "Exclusive": 432.28,
>             "Discount": 0,
>              "Tax": 64.84,
>               "Total": 497.12,
>                "Comments": "",
>                 "AnalysisCategoryId1": 16041,
>                  "UnitCost": 0
>               }
>            ]
>         },

Мне нужно сделать следующее: вернуть все записи, в которых конкретное поле («Создано») содержит текущий год, даже если результатов больше 100. Я предполагаю, что нужно будет использовать функции $ search и skip, но я не уверен в синтаксисе.

Спасибо, Стивен

Если это не ваш api, то skip and take не поможет, если не будет открыт аналогичный механизм.

Ross Bush 19.10.2018 15:08

Разработчик API посоветовал использовать skip, поэтому я предполагаю, что он будет работать, если синтаксис правильный.

Steven Nel 19.10.2018 15:16

@StevenNel все клиенты OData предоставляют такие операторы, как Skip. В C# вы должны написать запрос LINQ с помощью Skip(100). Какой язык и какой клиент вы используете? Зачем создавать необработанный URL? В любом случае вы используете клиент и проверяете URL-адрес, который он генерирует.

Panagiotis Kanavos 19.10.2018 15:20

Я подключаюсь к API с помощью Excel. На данный момент просто использую функцию внешнего источника данных, но я мог бы использовать VBA.

Steven Nel 19.10.2018 18:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Согласно документации здесь, вы должны добавить аргумент пропуска в URL.

Что-то вроде:

https://accounting.sageone.co.za/api/2.0.0/TaxInvoice/get?apikey = {xxxxxxxxxx}&companyid=12345&includeDetail=true&$skip=100&$orderby=Created%20desc

Приведенный пример был:

https://services.odata.org/OData/OData.svc/Products?$skip=2&$top=2&$orderby=Rating

Возможно, вам придется немного повозиться, но, похоже, это метод.

Чтобы вернуть все записи, в которых конкретное поле («Создано») содержит текущий год, вам необходимо добавить к URL-адресу указанные ниже критерии фильтрации. Вы можете увидеть, что другая функция OData Date поддерживает здесь.

&$filter=year(Created) eq 2018

OData обрабатывает нумерацию страниц для служб, которые могут возвращать огромные данные. Поскольку ограничение API составляет 100, что указывает на размер страницы данных, вы получите максимум 100 записей на один вызов службы. Чтобы получить записи от 101 до 200, вам нужно пропустить первые 100, добавив $skip=100 к URL-адресу. Также, если вам нужно получить записи от 201 до 300, добавьте $ skip = 200 к URL-адресу и так далее, пока не получите 2481 запись. Это означает, что вам нужно вызвать в сервис 25 раз, увеличив значение $skip.

Таким образом, с дополнительным фильтром и запросом пропуска вам необходимо добавить строку запроса ниже к существующему URL-адресу

 &$filter=year(Created) eq 2018&$skip=100

Кроме того, если вы хотите получать менее 100 записей на один вызов службы, вам необходимо использовать запрос $top. Допустим, если у вас в приложении размер страницы 50, добавьте $top=50 в строку запроса.

Другие вопросы по теме