Il codice
Ho creato una classe PHP per comunicare con l'API di Instagram. Sto usando una funzione privata chiamata api_request
(vedi sotto) per comunicare con le API di Instagram:Perché l'impaginazione di Instagram restituisce la stessa pagina più e più volte?
private function api_request($request = null) {
if (is_null($request)) {
$request = $this->request["httpRequest"];
}
$body = wp_remote_retrieve_body(wp_remote_get($request, array(
"timeout" => 10,
"content-type" => "application/json"
)
)
);
try {
$response = json_decode($body, true);
$this->data["pagination"] = $response["pagination"]["next_url"];
$this->data["response"] = $response["data"];
$this->setup_data($this->data);
} catch (Exception $ex) {
$this->data = null;
}
}
Queste due righe di codice ...
$this->data["pagination"] = $response["pagination"]["next_url"];
$this->data["response"] = $response["data"];
... imposta miei dati all'interno di questa matrice :
private $data = array (
"response" => null,
"pagination" => null,
"photos" => array()
);
Il problema
Ogni volta che richiederanno la pagina successiva, con la seguente funzione:
public function pagination_query() {
$this->api_request($this->data["pagination"]);
$output = json_encode($this->data["photos"]);
return $output;
}
Instagram mi dà la prima pagina, più e più e più guadagno. Qualche idea sul problema?
Update # 1
ho capito che perché il mio setup_data
funzione (utilizzato in funzione api_request
) spinge miei oggetti foto sulla fine del mio $this->data["photos"]
array:
private function setup_data($data) {
foreach ($data["response"] as $obj) {
/* code that parses the api, goes here */
/* pushes new object onto photo stack */
array_push($this->data["photos"], $new_obj);
}
}
... è necessario per creare una matrice vuota, quando si richiede una nuova pagina:
public function pagination_query() {
$this->data["photos"] = array(); // kicks out old photo objects
$this->api_request($this->data["pagination"]);
$output = json_encode($this->data["photos"]);
return $output;
}
Sono in grado di recuperare la seconda pagina ma tutte le successive chiamate pagination_query
restituiscono solo la seconda pagina. Qualche idea su cosa possa essere sbagliato?
Aggiornamento # 2
ho scoperto che utilizzando un'istruzione while
, per rendere la funzione api_request
stessa chiamata, permette a me recuperare pagina dopo pagina bene:
private function api_request($request = null) {
if (is_null($request)) {
$request = $this->request["httpRequest"];
}
$body = wp_remote_retrieve_body(wp_remote_get($request, array(
"timeout" => 18,
"content-type" => "application/json"
)
)
);
try {
$response = json_decode($body, true);
$this->data["response"] = $response["data"];
$this->data["next_page"] = $response["pagination"]["next_url"];
$this->setup_data($this->data);
// while state returns page after page just fine
while (count($this->data["photos"]) < 80) {
$this-> api_request($this->data["next_page"]);
}
} catch (Exception $ex) {
$this->data = null;
}
}
Tuttavia, questo doesn Risolvo la mia funzione pagination_query
e sembra che il mio blocco try-catch
stia creando una chiusura e non sono proprio sicuro di cosa farne.
quale è l'output dell'array '$ response' –
Ciao @MichaelStClair puoi trovare la struttura della busta di risposta qui: [Instagram API Endpoint] (https://instagram.com/developer/endpoints/) – Wilhelm
stampa out '$ response [" pagination "] [" next_url "];' e vedi se c'è anche un valore lì –