2015-06-10 8 views
12

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.

+0

quale è l'output dell'array '$ response' –

+0

Ciao @MichaelStClair puoi trovare la struttura della busta di risposta qui: [Instagram API Endpoint] (https://instagram.com/developer/endpoints/) – Wilhelm

+0

stampa out '$ response [" pagination "] [" next_url "];' e vedi se c'è anche un valore lì –

risposta

2

Nel tuo primo frammento di codice che avete:

$this->data["response"] = $response["data"]; 
    $this->data["next_page"] = $response["pagination"]["next_url"]; 

Nota due tasti: response e next_page

Poi, nel tuo secondo frammento di cui si dispone:

$this->data["pagination"] = $response["pagination"]["next_url"]; 
    $this->data["response"] = $response["data"]; 

Ora next_page è pagination

Ora, se si utilizza

$this->api_request($this->data["pagination"]); 

Ma si utilizza $this->data["next_page"] = $response["pagination"]["next_url"]; ovviamente non sarà possibile ottenere i risultati giusti.

In ogni caso cercare di var_dump il contenuto della vostra richiesta $:

public function pagination_query() { 
    var_dump($this->data["pagination"]); 
    $this->api_request($this->data["pagination"]); 
    $output = json_encode($this->data["photos"]); 

    return $output; 
} 

Se si dispone di un debbugger controllare anche all'interno api_request che è l'url passato ogni volta

+0

Grazie per avermelo fatto notare. Ho aggiornato il nome della chiave per chiarezza e ho dimenticato di aggiornarlo nella mia domanda (mi dispiace per quello). Riguardo al 'var dump', ho cambiato il' return' nella mia funzione 'pagination_query' a' return $ this-> data ["next_page"] 'e restituisce il link alla seconda pagina più e più volte.L'unica domanda che sto cercando di capire è perché tutte le successive chiamate a 'pagination_query' restituiscono il link dalla prima volta che è stato chiamato? – Wilhelm

+0

Pensa che qualcosa, nel mio blocco 'try-catch', causerebbe la permanenza o l'aggiornamento delle variabili? – Wilhelm

+0

sì, se l'animazione non funziona correttamente durante la prova ... catch you will not get the next_url correttamente – dynamic

0

ho aggiunto il seguenti righe di codice al try blocco della mia try...catch dichiarazione di tornare più pagine successive alla volta:

while (count($this->data["photos"]) < 160) { 
    $this-> api_request($this->data["next_page"]); 
} 

Questo Essent ial dice a api_request di chiamare se stesso fino a quando il mio array $this->data["next_page"] non viene popolato con 160 "grammi".

Questo mi permette di recuperare un totale di 320 grammi via api di Instagram: 160 grammi quando api_request viene chiamato dopo il caricamento della pagina e un altro 160 dal mio primo pagination_query chiamata.

Questa non è una soluzione ideale come seconda pagination_query chiamata ancora restituisce gli stessi dati dal mio primo pagination_query chiamata ma si dovrà fare per il momento.

Aggiornamento

La soluzione di cui sopra è un hack. Se qualcuno riesce a capire perché il mio metodo pagination_query non funziona ancora, sarebbe molto apprezzato.