API调用限制为500个结果-如何迭代获得所有结果?

时间:2019-01-30 20:21:46

标签: php json api

我正在开发一个Web应用程序,该应用程序将遍历API结果以插入到MySQL数据库中。

我使用的API限制记录每次调用最多返回500。

它们具有一个参数,您可以在其中选择从哪个“页面”返回结果,因此对于1504(当前记录数)记录,我可以调用第2页并从500-999返回结果。

我充其量只是个半新手,这是我第一次尝试使用API​​ ...我正在努力寻找如何收集所有1504个结果的方法。

关于此的API文档为:https://developer.trademe.co.nz/api-reference/search-methods/rental-search/

我可以使用“ page”参数选择所需的结果页面。

$url = "https://api.tmsandbox.co.nz/v1/Search/Property/Rental.json";

$headr = array();
$headr[] = 'Content-length: 0';
$headr[] = 'Authorization: OAuth oauth_consumer_key="xxx", oauth_signature_method="PLAINTEXT", oauth_signature="xxx"';

$curl = curl_init();
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 120);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 120);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_HTTPHEADER,$headr);
$pageSize = 10;
$data = array(
    "rows" => $pageSize,
    "sort_order" => "ExpiryDesc",
    "page" => 1
);
$totalPages = PHP_INT_MAX;
$result = [];
do {
    curl_setopt($curl, CURLOPT_URL, $url."?".http_build_query ($data));
    $resulta = curl_exec($curl);

    $array = json_decode($resulta, true);
    array_merge($result, $array);
    $data['page']++;
    if ( $totalPages == PHP_INT_MAX )   {
        $totalPages = floor($array['TotalCount']/$pageSize);
    }

}
while ( $totalPages < $data['page']);

$properties = $array['List'];
$prop_count = $array['TotalCount'];
curl_close($curl);

这是我用来返回500个结果的代码。 $ prop_count保留总行数(1504),$ pages保留页数(在本例中为3.08)。

谁能请我在逻辑顺序上抢先一步,以实现某种循环以返回所有结果?我坐在这里,全神贯注地尝试入门。

2 个答案:

答案 0 :(得分:1)

尽管无法测试,但这里的原理是继续发出请求,直到没有更多页面为止。第一次循环时,它将计算出页数(使用返回的内容中的TotalCount / pageSize-使用floor(),从而使3.1变为3)。然后,在循环结束时,它检查当前页面是否是>总页面。

$curl = curl_init();
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 120);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 120);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_HTTPHEADER,$headr);
$pageSize = 500;
$data = array(
    "rows" => $pageSize,
    "sort_order" => "ExpiryDesc",
    "page" => 1
);
$totalPages = PHP_INT_MAX;
$result = [];
do {
    curl_setopt($curl, CURLOPT_URL, $url."?".http_build_query ($data));
    $resulta = curl_exec($curl);

    $array = json_decode($resulta, true);
    $result[] = $array['List'];
    $data['page']++;
    if ( $totalPages == PHP_INT_MAX )   {
        $totalPages = floor($array['TotalCount']/$pageSize);
    }

}
while ( $totalPages > $data['page']);
curl_close($curl);

// Loop through the pages of results and in each page each listing
foreach ( $result as $page )    {
    foreach ( $page as $item ){
        // Process each item
        echo $item['ListingId'].PHP_EOL;
    }
}

答案 1 :(得分:0)

使用循环并再次发送请求。

    for($i=1;$i<4;$i++)
        request(rows=$i*500);

行会是这样

i=1, rows=500
i=2, rows=1000
i=3, rows=1500
i=4, rows=2000
相关问题