我正在开发一个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)。
谁能请我在逻辑顺序上抢先一步,以实现某种循环以返回所有结果?我坐在这里,全神贯注地尝试入门。
答案 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