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

标签 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)。

任何人都可以让我先了解实现某种循环以返回所有结果的逻辑顺序吗?我坐在这里绞尽脑汁地想开始。

最佳答案

虽然无法测试这一点,但这里的原则是不断发出请求,直到没有更多页面为止。第一次循环时,它将计算出页数(使用返回内容中的 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;
    }
}

关于php - API 调用限制为 500 个结果 - 如何迭代以获取所有结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54448941/

相关文章:

javascript - 从 JavaScript 代码创建多行文本文件

php - MySQL中两列在网页中的显示比例

c# - 如何将此格式的 JSON 返回到字符串数组中

javascript - 如何将 fetch API 请求中的 json 数据存储到全局变量中 - javascript

php - Laravel - 无效参数号 : parameter was not defined [Named Parameters Error]

php - jQuery AJAX上传系统IE问题

java - JacksonMapper 反序列化空值

php - php 有 fcgi-api 吗?

reactjs - 有没有办法使用 api 映射城市数组上的城市并渲染数组上所有城市的信息?

javascript - 无法读取未定义的属性 0