Извлеките все данные Api Restful из Atera в мою базу данных

#php #mongodb #curl #guzzle

Вопрос:

Я новичок в этом Restful Api, в настоящее время я использую Restful Api из Atera в своей базе данных MongoDB.

Это пример из Api Atera

 {  "items": [  {  "AlertID": xxxx,  "Code": xxxx,  "Source": "string",  "Title": "string",  "Severity": "Information",  "Created": "2021-12-01T01:09:52.888Z",  "SnoozedEndDate": "2021-12-01T01:09:52.888Z",  "DeviceGuid": "string",  "AdditionalInfo": "string",  "Archived": true,  "AlertCategoryID": "Hardware",  "ArchivedDate": "2021-12-01T01:09:52.888Z",  "TicketID": xxxx,  "AlertMessage": "string",  "DeviceName": "string",  "CustomerID": xxxx,  "CustomerName": "string",  "FolderID": xxxx,  "PollingCyclesCount": 0  }  ],  "totalItemCount": 6783,  "page": 1,  "itemsInPage": 20,  "totalPages": 290,  "prevLink": "",  "nextLink": "http://app.atera.com/api/v3/alerts?page=2amp;itemsInPage=20" } 

И это будет мой код для извлечения Api с помощью Guzzle

 $client = new Client(); $uri = 'https://app.atera.com/api/v3/alerts'; $header = ['headers' =gt; ['X-Api-Key' =gt; 'xxxxxxx']]; $res = $client-gt;get($uri, $header); $data = json_decode($res-gt;getBody()-gt;getContents(), true); 

Как вы можете видеть, я использую Guzzle, чтобы получить это, но каким-то образом я могу получить максимум 20 элементов, но я вижу, что это ограничивает количество элементов на странице, которое составляет 20 элементов на странице, но я хочу получить все, и у меня более 6000 элементов предупреждений.

Выборки, которые я пробовал…
получать оповещения?предметов=6000
получать оповещения?itemsInPage=6000
получать оповещения?itemsInPage[размер]=6000
получать оповещения?лимит=6000
получать оповещения?топ=6000
получать оповещения?кол-во=6000
получать оповещения?размер=6000
получать оповещения?смещение=6000
получать оповещения?лимит=6000amp;смещение=0
получить уведомления?лимит=6000amp;смещение=6000
получать оповещения?sysparm_limit=10000amp;sysparm_offset=10000
и многое другое…

Тем не менее, я получаю максимум 20, есть ли какой-нибудь способ получить все сразу?

Ответ №1:

Из данных api, которые вы показали выше в качестве примера, ясно, что api atera, который вы используете, имеет систему разбиения на страницы для отправки данных.

Вы можете видеть выше

 "totalItemCount": 6783, "page": 1, "itemsInPage": 20, "totalPages": 290, "prevLink": "", "nextLink": "http://app.atera.com/api/v3/alerts?page=2amp;itemsInPage=20"  

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

Вы можете создать цикл while с условием успешного завершения, если и только если следующая ссылка завершена(может быть пустой, вам нужно это проверить), если есть вероятность, что для некоторых из них ответ завершится неудачно, вы можете создать исключение и выйти, сохранить все данные ответа в массиве.


Назовите свой запрос так для следующих страниц "nextLink": "http://app.atera.com/api/v3/alerts?page=2amp;itemsInPage=20"

 $client = new GuzzleHttpClient(); $uri = 'http://app.atera.com/api/v3/alerts'; $headers = ['X-Api-Key' =gt; 'xxxxxxx']; $res = $client-gt;get($uri, [  'query' =gt; ['page' =gt; $page_number, 'itemsInPage' =gt; 20],  'headers' =gt; $headers ]);  

здесь вы можете задать номер страницы в соответствии с циклом.