paginated api request, как узнать, есть ли другая страница?

Я создаю класс 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-ответов на общее количество элементов в наборе