trabajo san pedagogicos miguel convocatoria conafe asesores allende php api pagination

php - san - conafe trabajo



Solicitud de API paginada, ¿cómo saber si hay otra página? (4)

Estoy creando una clase de PHP que usa una API de terceros. La API tiene un método con esta estructura de URL de solicitud:

https://api.domain.com/path/sales?page=x

Donde "x" es el número de página.

Cada página devuelve 50 ventas y necesito devolver un número indefinido de páginas para cada usuario (dependiendo de las ventas del usuario) y almacenar algunos datos de cada venta.

Ya he creado algunos métodos que obtienen los datos de la URL, decodifican y crean una nueva matriz con los datos deseados, pero solo con la primera solicitud de la página.

Ahora quiero crear un método que verifique si hay otra página, y si la hay, consígala y vuelva a hacer el control

¿Cómo puedo verificar si hay otra página? ¿Y cómo crear un ciclo que obtenga otra página si hay una?

Ya tengo este código, pero crea un ciclo infinito.

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); }

No uso CURL, utilizo file_get_content . Cuando solicito una página fuera de rango, obtengo este resultado:

string(2) "[]"

Y este otro después de json_decode :

array(0) { }


Según mi experiencia con varias API, la respuesta devuelve el número de filas encontradas, y el número x por página comienza en la página 1. En su caso, si la respuesta tiene el número de filas, simplemente divídala por la página x número y repita los resultados como números de página.

$results =1000; $perPage = 50; $pages = ceil($results/$perPage); for (i=1 ; $i < $pages; $pages++){ // execute your api call and store the results }

Espero que esto ayude.


De las respuestas que has mostrado, obtienes una matriz vacía si no hay resultados. En ese caso, podría usar el método empty en un bucle para determinar si hay algo que informar:

// 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; }

De esa forma, seguirá pasando por todas las páginas, hasta que no haya más datos.


Desde su entrada, en el ciclo while, cambia el $ url (que en realidad contiene los datos devueltos por la llamada a la API) y esto se comprueba en vacío, si estoy en lo cierto.

$url = $my_class->get_data($sales_url);

Si lo anterior es solo la respuesta original (por lo tanto, en caso de que la página esté fuera de rango una cadena "[]"), nunca se vaciará ("[]") en verdadero. Así que supongo que el valor de retorno de get_data es esta cadena, mientras que debería ser la matriz real / json incluso si el resultado es vacío (es decir, sospecho que se realiza el json_decode una vez que se han recopilado los datos, por ejemplo, fuera del ciclo).

Si este es el caso, mi sugerencia sería verificar "[]" en el ciclo (por ejemplo, while ($ url! == "[]")) o dentro del loop decodificar los datos de respuesta ($ url = json_decode ( $ url)).


Compruebe los encabezados de respuesta http para el número total de elementos en el conjunto