Я использую 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, поэтому я предполагаю, что он будет работать, если синтаксис правильный.
@StevenNel все клиенты OData предоставляют такие операторы, как Skip. В C# вы должны написать запрос LINQ с помощью Skip(100)
. Какой язык и какой клиент вы используете? Зачем создавать необработанный URL? В любом случае вы используете клиент и проверяете URL-адрес, который он генерирует.
Я подключаюсь к API с помощью Excel. На данный момент просто использую функцию внешнего источника данных, но я мог бы использовать VBA.
Согласно документации здесь, вы должны добавить аргумент пропуска в 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
в строку запроса.
Если это не ваш api, то skip and take не поможет, если не будет открыт аналогичный механизм.