Parcourir les pages d'une API via cURL Multi
Posté : 07 janv. 2020, 19:33
Bonsoir à tous,
Je suis confronté à un petit problème dont je n'arrive pas à me sortir et je voulais vous demander un petit coup de main svp.
Objectif => Récupérer les datas de plusieurs URL's à l'aide de curl_multi_exec() provenant d'une API qui possède un système de pagination
Problème => J'arrive à faire une loop sur 1 seule URL en incrémentant la pagination à l'aide de la variable $pagination_cursor à l'aide d'un simple call cURL mais pas en utilisant curl_multi...
Réponse de l'API sur la pagination => l'API utilisée retourne un array comprenant :
[pagination] => Array
(
[current_cursor] => dWRhQVZZVnBWbDlhenJ5QVF1Q1lqa0M0bUFPa1FBNVVtdXVIS05CZkxucz0tLU1RVE5RMEVKS21qaDN0aUtFTzhjZFE9PQ==--ebcbf5c471ee977885f8775515a20d10b9e83ab3
[next_cursor] => TGlLUTlyV0RvOXk3WWZwanFoR3kza1JpcThtUkI5VTJkdU1LVFEvTmV1Zz0tLUwvVUsvd1VFNDNxL2Q2dWtZYWh6MUE9PQ==--74259d1461f7f1c8dbceb615cbba9aaa7cc0015b
)
Conformément à la doc il faut utiliser la réponse ['pagination']['next_cursor'] pour parcourir les pages.
Voici mon call sur une seule URL qui va bien parcourir toutes les pages et afficher tous les résultats à l'aide d'une boucle while :

Je suis confronté à un petit problème dont je n'arrive pas à me sortir et je voulais vous demander un petit coup de main svp.
Objectif => Récupérer les datas de plusieurs URL's à l'aide de curl_multi_exec() provenant d'une API qui possède un système de pagination
Problème => J'arrive à faire une loop sur 1 seule URL en incrémentant la pagination à l'aide de la variable $pagination_cursor à l'aide d'un simple call cURL mais pas en utilisant curl_multi...
Réponse de l'API sur la pagination => l'API utilisée retourne un array comprenant :
[pagination] => Array
(
[current_cursor] => dWRhQVZZVnBWbDlhenJ5QVF1Q1lqa0M0bUFPa1FBNVVtdXVIS05CZkxucz0tLU1RVE5RMEVKS21qaDN0aUtFTzhjZFE9PQ==--ebcbf5c471ee977885f8775515a20d10b9e83ab3
[next_cursor] => TGlLUTlyV0RvOXk3WWZwanFoR3kza1JpcThtUkI5VTJkdU1LVFEvTmV1Zz0tLUwvVUsvd1VFNDNxL2Q2dWtZYWh6MUE9PQ==--74259d1461f7f1c8dbceb615cbba9aaa7cc0015b
)
Conformément à la doc il faut utiliser la réponse ['pagination']['next_cursor'] pour parcourir les pages.
Voici mon call sur une seule URL qui va bien parcourir toutes les pages et afficher tous les résultats à l'aide d'une boucle while :
$pagination_current = 0;
$pagination_last = 1;
$pagination_cursor;
while( ($pagination_current != $pagination_last)){
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => 'https://api.fountain.com/v2/applicants?api_token=********************&funnel_id=*****************&stage_id=*********************&cursor='.$pagination_cursor,
CURLOPT_USERAGENT => 'Sample cURL Request'
));
$response = curl_exec($curl);
$error = curl_error($curl);
curl_close($c);
if ($error) {
$errMsg = "Oops, une erreur s'est produite. Veuillez réessayer";
echo $errMsg;
} else {
$applicants = json_decode($response, true);
print_r(count($applicants["applicants"]));
print_r("<br />");
print_r($applicants);
foreach( $applicants["applicants"] as $applic){
print_r($applic["email"]);
}
print_r($applicants["pagination"]);
if( !empty($applicants["pagination"]["current"])){
$pagination_current = $applicants["pagination"]["current"];
} else {
$pagination_current++;
}
if ( !empty($applicants["pagination"]["last"])){
$pagination_last = $applicants["pagination"]["last"];
}
$pagination_cursor = $applicants["pagination"]["next_cursor"];
print_r("<br />");
print_r($pagination_current);
print_r("<br />");
print_r($pagination_last);
print_r("<br />");
print_r($pagination_cursor);
print_r("<br /><br />");
}
}
Et ensuite mon call multi qui ne m'affiche que la première page de résultat par URL. J'ai tenté beaucoup de choses et je comprend qu'il faut que je fasse une boucle de la même manière que mon call à une seule URL mais je suis bloqué je n'y parviens pas. $Requetes = [
'https://api.fountain.com/v2/applicants?api_token=*****************&funnel_id=************************&stage_id=************&cursor='.$pagination_cursor,
'https://api.fountain.com/v2/applicants?api_token=*****************&funnel_id=************************&stage_id=************&cursor='.$pagination_cursor,
'https://api.fountain.com/v2/applicants?api_token=*****************&funnel_id=************************&stage_id=************&cursor='.$pagination_cursor,
'https://api.fountain.com/v2/applicants?api_token=*****************&funnel_id=************************&stage_id=************&cursor='.$pagination_cursor,
'https://api.fountain.com/v2/applicants?api_token=*****************&funnel_id=************************&stage_id=************&cursor='.$pagination_cursor,
'https://api.fountain.com/v2/applicants?api_token=*****************&funnel_id=************************&stage_id=************&cursor='.$pagination_cursor,
'https://api.fountain.com/v2/applicants?api_token=*****************&funnel_id=************************&stage_id=************&cursor='.$pagination_cursor,
'https://api.fountain.com/v2/applicants?api_token=*****************&funnel_id=************************&stage_id=************&cursor='.$pagination_cursor,
'https://api.fountain.com/v2/applicants?api_token=*****************&funnel_id=************************&stage_id=************&cursor='.$pagination_cursor,
'https://api.fountain.com/v2/applicants?api_token=*****************&funnel_id=************************&stage_id=************&cursor='.$pagination_cursor,
'https://api.fountain.com/v2/applicants?api_token=*****************&funnel_id=************************&stage_id=************&cursor='.$pagination_cursor,
'https://api.fountain.com/v2/applicants?api_token=*****************&funnel_id=************************&stage_id=************&cursor='.$pagination_cursor,
'https://api.fountain.com/v2/applicants?api_token=*****************&funnel_id=************************&stage_id=************&cursor='.$pagination_cursor,
'https://api.fountain.com/v2/applicants?api_token=*****************&funnel_id=************************&stage_id=************&cursor='.$pagination_cursor,
'https://api.fountain.com/v2/applicants?api_token=*****************&funnel_id=************************&stage_id=************&cursor='.$pagination_cursor
];
function MultiCurl($Requetes) {
$Curls = [];
$Resultats = [];
// Initialisation des instances
$MultiCurl = curl_multi_init();
foreach($Requetes as $Num => $Requete) {
$Curls[$Num] = curl_init();
echo "Loading From URL:" . $Requete . "<br/>\n";
curl_setopt($Curls[$Num], CURLOPT_URL, $Requete);
curl_setopt($Curls[$Num], CURLOPT_RETURNTRANSFER, 1);
curl_multi_add_handle($MultiCurl, $Curls[$Num]);
}
// Execution
$actif = null;
do {
curl_multi_exec($MultiCurl, $actif);
curl_multi_select($MultiCurl);
} while ($actif > 0);
// Récup des données et suppression des instances
foreach ($Curls as $Num => $Resultat) {
$Resultats[$Num] = json_decode(curl_multi_getcontent($Resultat), true);
print_r($Resultats[$Num]);
curl_multi_remove_handle($MultiCurl, $Resultat);
}
curl_multi_close($MultiCurl);
return $Resultats;
}
MultiCurl($Requetes);
Merci à tous ceux qui pourraient m'aider