2015-06-10 14 views
12

Bộ luật

tôi đã tạo ra một lớp PHP để giao tiếp với API Instagram của. Tôi đang sử dụng một chức năng riêng được gọi là api_request (hình dưới đây) để giao tiếp với API Instagram của:Tại sao số trang của Instagram trả lại cùng một trang?

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

Hai dòng mã ...

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

... thiết lập dữ liệu của tôi trong mảng này :

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

vấn đề

Bất cứ khi nào tôi yêu cầu trang tiếp theo, với chức năng sau:

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

    return $output; 
} 

Instagram cho tôi trang đầu tiên, hết lần này đến lần khác. Bất kỳ ý tưởng nào là vấn đề ở đây?

Update # 1

tôi nhận ra rằng vì setup_data chức năng của tôi (được sử dụng trong api_request chức năng) đẩy đối tượng hình ảnh của tôi vào cuối $this->data["photos"] mảng của tôi:

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

... nó là cần thiết để tạo một mảng trống, khi yêu cầu một trang mới:

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

Tôi có thể truy xuất trang thứ hai nhưng tất cả các cuộc gọi pagination_query tiếp theo chỉ trả lại trang thứ hai. Bất kì ý kiến ​​nào có thể sai?

Update # 2

tôi phát hiện ra rằng việc sử dụng một tuyên bố while, để làm cho api_request chức năng gọi chính nó, cho phép tôi lấy trang sau khi trang tốt:

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

Tuy nhiên, doesn này 't sửa chức năng của tôi pagination_query và nó xuất hiện như thể khối try-catch của tôi là tạo ra một đóng cửa và tôi không thực sự chắc chắn những gì để làm cho điều này.

+0

đầu ra của mảng '$ response' là gì –

+0

Hi @MichaelStClair bạn có thể tìm thấy cấu trúc của phong bì phản hồi tại đây: [Instagram API Endpoints] (https://instagram.com/developer/endpoints/) – Wilhelm

+0

in ra '$ response [" pagination "] [" next_url "];' và xem liệu có một giá trị ở đó không –

Trả lời

2

Trong đoạn đầu tiên của mã bạn có:

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

Lưu ý hai phím: responsenext_page

Sau đó, trong đoạn thứ hai của bạn, bạn có:

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

Bây giờ next_pagepagination

Bây giờ, nếu bạn sử dụng

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

Nhưng bạn đang sử dụng $this->data["next_page"] = $response["pagination"]["next_url"]; tất nhiên bạn sẽ không nhận được kết quả phù hợp.

Trong mọi trường hợp cố gắng var_dump nội dung của của $ yêu cầu của bạn:

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

    return $output; 
} 

Nếu bạn có một debbugger cũng kiểm tra bên trong api_request đó là url qua mỗi lần

+0

Cảm ơn bạn đã chỉ ra điều đó. Tôi cập nhật tên của khóa cho rõ ràng và quên để cập nhật nó trong câu hỏi của tôi (Xin lỗi về điều đó). Liên quan đến 'var dump', tôi đã thay đổi' return' trong hàm 'pagination_query' thành' return $ this-> data ["next_page"] 'và nó trả về liên kết đến trang thứ hai lặp đi lặp lại.Câu hỏi duy nhất tôi đang cố gắng tìm ra là tại sao tất cả các cuộc gọi 'pagination_query' tiếp theo trả lại liên kết từ lần đầu tiên nó được gọi? – Wilhelm

+0

Bạn có nghĩ điều gì đó, trong khối 'try-catch' của tôi, sẽ khiến các biến tồn tại hoặc không cập nhật? – Wilhelm

+0

có nếu sonething đi sai trong thử ... bắt bạn sẽ không nhận được next_url chính xác – dynamic

0

Tôi đã thêm sau dòng mã để các try khối tuyên bố try...catch tôi trở lại một vài trang liên tiếp tại một thời điểm:

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

Essent này ially yêu cầu api_request gọi chính nó cho đến khi mảng $this->data["next_page"] của tôi được điền với 160 "gram".

Điều này cho phép tôi truy xuất tổng cộng 320 gram từ api của Instagram: 160 gram khi api_request được gọi sau khi tải trang và 160 lần khác từ cuộc gọi pagination_query đầu tiên của tôi.

Đây không phải là một giải pháp lý tưởng như một pagination_query cuộc gọi thứ hai vẫn trả về cùng một dữ liệu từ pagination_query cuộc gọi đầu tiên của tôi, nhưng nó sẽ phải làm trong thời gian này.

Cập nhật

Các giải pháp trên là một hack. Nếu bất cứ ai có thể tìm ra lý do tại sao phương pháp pagination_query của tôi vẫn không hoạt động, nó sẽ được đánh giá cao.

Các vấn đề liên quan