2015-06-10 3 views
12

Код

Я создал класс PHP для связи с API-интерфейсом Instagram. Я использую частные функции под названием api_request (как показано ниже), чтобы общаться с API Instagram в:Почему постраничная страница Instagram возвращает одну и ту же страницу снова и снова?

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

Эти две строки кода ...

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

... устанавливает мои данные в этом массиве :

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

Проблема

Всякий раз, когда я прошу на следующей странице, с помощью следующей функции:

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

    return $output; 
} 

Instagram дает мне первую страницу, снова и снова и усиления. Любая идея, в чем проблема?

Update # 1

я понял, что, потому что моя setup_data функция (используется в api_request функции) толкает мои фото объекты на конце моего $this->data["photos"] массива:

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

... это необходимо создать пустой массив при запросе на новую страницу:

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

Я могу получить вторую страницу, но все последующие вызовы pagination_query возвращают только вторую страницу. Любые идеи, что может быть неправильным?

Update # 2

я обнаружил, что с помощью while заявление, чтобы сделать функцию api_request называть себя, позволяет мне получить страницу за страницей, просто отлично:

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

Однако это Безразлично 't исправить мою функцию pagination_query, и кажется, что мой блок try-catch создает закрытие, и я не совсем уверен, что с этим делать.

+0

Что такое результат массива '$ response' –

+0

Привет @MichaelStClair вы можете найти структуру оболочки ответа здесь: [Конечные точки API-схемы] (https://instagram.com/developer/endpoints/) – Wilhelm

+0

print out '$ response [" pagination "] [" next_url "];' и посмотреть, есть ли там значение –

ответ

2

В своем первом фрагменте кода у вас есть:

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

Примечание две клавиши: response и next_page

Тогда в вашем втором фрагменте кода у вас есть:

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

Теперь next_page является pagination

Теперь, если вы используете

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

Но вы используете $this->data["next_page"] = $response["pagination"]["next_url"];, конечно, вы не получите правильные результаты.

В любом случае попробуйте var_dump содержание Вашего запроса $:

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

    return $output; 
} 

Если у вас есть debbugger также проверить внутри api_request, который является URL передается каждый раз, когда

+0

Спасибо, что указали это. Я уточнил имя ключа для ясности и забыл обновить его в моем вопросе (извините за это). Что касается 'var dump', я изменил' return' в моей функции 'pagination_query', чтобы возвращать $ this-> data [" next_page "]' и снова и снова ссылается на вторую страницу.Единственный вопрос, который я пытаюсь выяснить, - почему все последующие вызовы 'pagination_query' возвращают ссылку с самого первого ее вызова? – Wilhelm

+0

Считаете ли вы, что что-то в моем блоке 'try-catch' приведет к тому, что переменные будут сохраняться или не обновляться? – Wilhelm

+0

да, если в попытке не получилось, что у вас что-то не получается ... поймайте, вы не получите next_url правильно – dynamic

0

Я добавил следующие строки кода в try блоке моего try...catch заявления, чтобы вернуть несколько последовательных страниц за один раз:

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

Это Essent ally сообщает api_request, чтобы позвонить себе, пока мой массив $this->data["next_page"] не будет заполнен 160-граммовыми буквами.

Это позволяет мне получить в общей сложности 320 грамм от api Instagram: 160 грамм, когда api_request вызывается после загрузки страницы и еще 160 из моего первого вызова pagination_query.

Это не является идеальным решением в качестве второго pagination_query вызова еще возвращает те же данные из моего первого pagination_query вызова, но это придется делать на некоторое время.

Обновление

Вышеуказанный раствор рубить. Если кто-то может понять, почему мой метод pagination_query все еще не работает, он был бы очень признателен.

Смежные вопросы