2015-08-10 13 views
7

Tworzę klasę PHP korzystającą z interfejsu API innej firmy. Interfejs API ma metodę o tej strukturze adresu URL żądania:żądanie stronicowania w aplecie, jak sprawdzić, czy jest inna strona?

https://api.domain.com/path/sales?page=x 

Gdzie "x" to numer strony.

Każda strona zwraca 50 sprzedaży i muszę zwrócić nieokreśloną liczbę stron dla każdego użytkownika (w zależności od sprzedaży użytkownika) i przechowywać niektóre dane z każdej sprzedaży.

Mam już stworzone metody, które pobierają dane z adresu URL, dekodują i tworzą nową tablicę z żądanymi danymi, ale tylko z pierwszym żądaniem strony.

Teraz chcę utworzyć że sprawdzić, czy istnieje inna strona metodę, a jeśli nie jest, to się i dokonać sprawdzenia ponownie

Jak mogę sprawdzić, czy istnieje inna strona? I jak stworzyć pętlę, która dostanie kolejną stronę, jeśli taka istnieje?

Mam już ten kod, ale tworzy on nieskończoną pętlę.

require('classes/class.example_api.php'); 
$my_class = new Example_API; 
$page = 1; 
$sales_url = $my_class->sales_url($page); 
$url = $my_class->get_data($sales_url); 

while (!empty($url)) { 
    $page++; 
    $sales_url = $my_class->sales_url($page); 
    $url = $my_class->get_data($sales_url); 
} 

Nie używam CURL, używam file_get_content. Kiedy żądać stronę poza zasięgiem, otrzymuję ten wynik:

string(2) "[]" 

a ten drugi po json_decode:

array(0) { } 
+0

Co oznacza api, gdy podajesz stronę poza zakresem? – Cyrbil

+0

Zakładając, że używasz CURL, czy żądanie zwraca wartość inną niż 200 przy próbie uzyskania dostępu do numeru strony, który nie istnieje? –

+0

Dzięki! Zmieniłem to pytanie, by odpowiedzieć na twoje pytania. – ThemesCreator

Odpowiedz

2

Z danych wejściowych, w pętli while, zmienisz adres URL $ (który faktycznie zawiera dane zwracane przez wywołanie API) i to jest sprawdzane pod kątem pustki, jeśli mam rację.

$url = $my_class->get_data($sales_url); 

Jeśli powyższe jest tylko oryginalny odpowiedź (tak w przypadku strony poza zakresem ciągiem „[]”), to nigdy nie będzie pusty („[]”) true. Domyślam się, że wartość zwracana przez get_data jest tym ciągiem, podczas gdy powinna to być faktyczna tablica/json, nawet jeśli wynik jest pusty (tj. Podejrzewam, że wykonujesz json_decode po zebraniu danych, np. Poza pętlą).

Jeśli tak jest, moją propozycją byłoby sprawdzenie "[]" w pętli (np. Podczas ($ url! == "[]")) lub w pętli odkodować dane odpowiedzi ($ url = json_decode ($ url)).

+0

Dzięki! To był problem, właśnie dodałem json_decode do odpowiedzi i to działa. – ThemesCreator

+0

cieszę się, że pomogłem :) – m1lt0n

0

Od odpowiedzi masz pokazane, masz pustą tablicę, jeśli istnieją brak wyników. W tym przypadku można zastosować metodę empty w pętli w celu określenia, czy jest coś zgłosić:

// Craft the initial request URL 
$page = 1; 
$url = 'https://api.domain.com/path/sales?page=' . $page; 

// Now start looping 
while (!empty(file_get_contents($url)) { 
    // There's data here, do something with it 

    // And set the new URL for the next page 
    $url = 'https://api.domain.com/path/sales?page=' . ++$page; 
} 

ten sposób będzie ona zachować pętli na wszystkie strony, aż nie ma więcej danych.

1

Z mojego doświadczenia z kilkoma interfejsami API, odpowiedź zwraca liczbę znalezionych wierszy i liczbę x na stronę, począwszy od strony 1. W twoim przypadku, jeśli odpowiedź ma liczbę wierszy, po prostu podziel ją przez x numer strony i przeglądaj wyniki w postaci numerów stron.

$results =1000; 
$perPage = 50; 
$pages = ceil($results/$perPage); 
for (i=1 ; $i < $pages; $pages++){ 
    // execute your api call and store the results 
} 

Mam nadzieję, że ta pomoc.

0

Sprawdź nagłówki odpowiedzi HTTP na łączną liczbę pozycji w zestawie

Powiązane problemy