Я создаю класс PHP, который использует сторонний API. API имеет метод с этой структурой URL-адреса запроса:
https://api.domain.com/path/sales?page=x
Где «x» – номер страницы.
Каждая страница возвращает 50 продаж, и мне нужно вернуть неопределенное количество страниц для каждого пользователя (в зависимости от продаж пользователя) и хранить некоторые данные из каждой продажи.
Я уже создал некоторые методы, которые получают данные из URL, декодируют и создают новый массив с нужными данными, но только с запросом первой страницы.
Теперь я хочу создать метод, который проверяет, есть ли другая страница, и если есть, получить его и снова проверить
Как проверить, есть ли другая страница? И как создать цикл, который получает другую страницу, если она есть?
У меня уже этот код, но он создает бесконечный цикл.
require('classes/class.example_api.php'); $my_class = new Example_API; $page = 1; $sales_url = $my_class->sales_url( $page ); $url = $my_class->get_data($sales_url); while ( !empty($url) ) { $page++; $sales_url = $my_class->sales_url( $page ); $url = $my_class->get_data($sales_url); }
Я не использую CURL, я использую file_get_content
. Когда я запрашиваю страницу вне диапазона, я получаю этот результат:
string(2) "[]"
И это другое после json_decode
:
array(0) { }
С вашего ввода в цикле while вы изменяете $ url (который фактически возвращает данные при вызове API), и это проверяется на пустоту, если я прав.
$url = $my_class->get_data($sales_url);
Если выше это только исходный ответ (поэтому в случае, если страница выходит за пределы диапазона, строка «[]»), она никогда не станет пустой («[]») до истины. Поэтому я предполагаю, что возвращаемое значение из get_data – это строка, в то время как это должен быть фактический массив / json, даже если результат пуст (т. Е. Я подозреваю, что вы выполняете json_decode после того, как вы собрали данные, например, вне цикла).
Если это так, моим предложением было бы либо проверить «[]» в цикле (например, while ($ url! == "[]")), либо внутри цикла декодировать данные ответа ($ url = json_decode ( $ URL)).
Из моего опыта работы с несколькими API, ответ возвращает количество найденных строк и число x на страницу, начиная со страницы 1. В вашем случае, если ответ имеет количество строк, просто разделите его на страницу с номером x и выполните цикл результаты как номера страниц.
$results =1000; $perPage = 50; $pages = ceil($results/$perPage); for (i=1 ; $i < $pages; $pages++){ // execute your api call and store the results }
Надеюсь, эта помощь.
Из ответов, которые вы указали, вы получаете пустой массив, если результатов нет. В этом случае вы можете использовать empty
метод в цикле, чтобы определить, есть ли что сообщить:
// Craft the initial request URL $page = 1; $url = 'https://api.domain.com/path/sales?page=' . $page; // Now start looping while (!empty(file_get_contents($url)) { // There's data here, do something with it // And set the new URL for the next page $url = 'https://api.domain.com/path/sales?page=' . ++$page; }
Таким образом, он будет перемещаться по всем страницам, пока не будет больше данных.
Проверьте заголовки HTTP-ответов на общее количество элементов в наборе