2015-06-10 7 views
12

Kod

Stworzyłem klasę PHP do komunikacji z interfejsem API Instagrama. Używam prywatną funkcję o nazwie api_request (pokazany poniżej), aby komunikować się z Instagram API:Dlaczego stronicowanie na Instagramie wraca do tej samej strony w kółko?

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

Te dwie linie kodu ...

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

... konfiguruje moich danych w tej tablicy :

private $data = array (
    "response"  => null, 
    "pagination" => null, 
    "photos"  => array() 
); 

problem

Ilekroć zwrócić się do następnej strony, z następujących funkcji:

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

    return $output; 
} 

Instagram daje mi pierwszą stronę, w kółko i na zysk. Czy wiesz, jaki jest problem?

Aktualizacja # 1

zdałem sobie sprawę, że z powodu mojego setup_data funkcja (stosowany w api_request funkcji) pcha moje obiektów fotograficznych na końcu mojego $this->data["photos"] tablicy:

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

... to jest konieczne, aby utworzyć pustą tablicę, żądając nowej strony:

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

Mogę pobrać drugą stronę, ale wszystkie kolejne wywołania pagination_query zwracają tylko drugą stronę. Jakieś pomysły, co może być nie tak?

Aktualizacja # 2

odkryłem, że przy użyciu while oświadczenie, aby funkcja api_request nazywać się, pozwala mi odzyskać strona po stronie porządku:

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

to jednak nie robi Naprawię moją funkcję pagination_query i wygląda na to, że mój blok try-catch tworzy zamknięcie i nie jestem do końca pewien, co z tym zrobić.

+0

jakie jest wyjście z tablicy '$ response' –

+0

Witam @MichaelStClair, tutaj możesz znaleźć strukturę koperty odpowiedzi: [Instagram API Endpoints] (https://instagram.com/developer/endpoints/) – Wilhelm

+0

drukuj out '$ response [" pagination "] [" next_url "];' i zobacz czy istnieje tam nawet wartość –

Odpowiedz

2

W pierwszym fragmencie kodu masz:

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

Uwaga dwa klawisze: response i next_page

Następnie w drugim fragmencie trzeba:

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

Teraz next_page jest pagination

Teraz jeśli używasz

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

Ale używasz $this->data["next_page"] = $response["pagination"]["next_url"]; oczywiście nie dostaniesz odpowiednie rezultaty.

W każdym przypadku staramy się var_dump zawartość Twojego $ request:

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

    return $output; 
} 

Jeśli masz debbugger również sprawdzić wewnątrz api_request który jest url przekazywane każdorazowo

+0

Dzięki za wskazanie tego. Zaktualizowałem nazwę klucza dla jasności i zapomniałem zaktualizować go w moim pytaniu (Przepraszam za to). W odniesieniu do 'var dump', zmieniłem' return' w mojej funkcji 'pagination_query' na' return $ this-> data ["next_page"] 'i zwraca link do drugiej strony w kółko.Jedyne pytanie, które próbuję wymyślić, to dlaczego wszystkie późniejsze wywołania 'pagination_query' zwracają odnośnik od razu po wywołaniu? – Wilhelm

+0

Czy myślisz, że coś w moim bloku 'try-catch' spowodowałoby, że zmienne utrzymałyby się lub nie aktualizowały? – Wilhelm

+0

tak, jeśli sonetowanie pójdzie nie tak w próbie ... złap, nie dostaniesz next_url poprawnie – dynamic

0

Dodałem po linii kodu do bloku try mojego try...catch oświadczeniu powrócić kilka kolejnych stron naraz:

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

Ten Essent zwykle mówi api_request, aby zadzwonić, dopóki moja tablica $this->data["next_page"] nie zostanie zapełniona 160 "gramami."

To pozwala mi pobrać łącznie 320 gramów z api aplikacji Instagram: 160 gramów po wywołaniu api_request po wczytaniu strony i kolejnych 160 od mojego pierwszego połączenia pagination_query.

Nie jest to idealne rozwiązanie jako drugi pagination_query rozmowy nadal zwraca te same dane z mojego pierwszego pagination_query rozmowy, ale będzie musiał zrobić w chwili obecnej.

Aktualizacja

Powyższe rozwiązanie jest hack. Jeśli ktokolwiek może dowiedzieć się, dlaczego moja metoda nadal nie działa, byłoby to bardzo cenne.

Powiązane problemy