#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 ]);
здесь вы можете задать номер страницы в соответствии с циклом.