Etsy API 分页 PHP
Etsy API Pagination with PHP
所以,我对使用 APIs 还很陌生,我只是想尝试使用 Etsy API 来显示一组特定的列表。
默认情况下,API return 是一组 25 个结果,一次最多可以做 100 个。我想展示的不止于此,所以我试图在我的电话中添加分页。到目前为止,这是我得到的:
<?php
//setting API key
define("API_KEY", XXX);
//setting request url
$url = "https://openapi.etsy.com/v2/listings/active?keywords=unicorn,unicorns&includes=Images:1:0&api_key=" . API_KEY;
while (isset($url) && $url != '') {
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$response_body=curl_exec($curl);
curl_close($curl);
$response = json_decode($response_body);
foreach ($response->results as $listing) {
echo "<li>" . $listing->title . " ~*~ " . $listing->price . " " . $listing->currency_code . " ~*~ " . '<a href="' . $listing->url . '" target="_blank">View on Etsy!</a>' . "</li>" . "<br>";
}
$url = $response->pagination->next_page;
}
?>
我认为这会循环并 return 下一组 25 个结果,但事实并非如此。有人有这方面的经验吗?我有什么地方被绊倒了吗?
谢谢!
在您的 while
块中,您将 next_page
属性 的值分配给 $url
。
但实际值是 int
, 2,而不是 url.
而是将 next_page
作为查询字符串变量附加到初始 url。
$url .= "&page=" . $response->pagination->next_page;
请参阅下面的示例,了解如何将每个进程隔离为一个函数。
我们将 curl
操作移动到它自己的函数中,它 returns 来自 json_decode
的对象。
我们将列表的整个处理转移到一个单独的函数中,现在它只打印列表。
第二个函数是递归的,也就是说,如果下一页存在,它将调用第一个函数,获取响应,然后进行处理。
<?php
//setting API key
define("API_KEY", 'br4j52uzdtlcpp6qxb6we3ge');
function get_listings($page=1){
$url = "https://openapi.etsy.com/v2/listings/active?keywords=unicorn,unicorns&includes=Images:1:0&api_key=" . API_KEY;
$url .= "&page=$page";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$response_body=curl_exec($curl);
curl_close($curl);
$responseObject = json_decode($response_body);
return $responseObject;
}
function process_listings($responseObject){
foreach ($responseObject->results as $listing) {
echo "Title: " . $listing->title . PHP_EOL .
"Price " . $listing->price . PHP_EOL .
"Currency code " . $listing->currency_code . PHP_EOL .
'URL ' . $listing->url . PHP_EOL;
}
print PHP_EOL . "Pagination " . $responseObject->pagination->next_page . PHP_EOL;
$next_page = $responseObject->pagination->next_page;
if ($next_page) {
$nextPageResponse = get_listings($next_page);
process_listings($nextPageResponse);
}
}
$firstPage = get_listings(); // page 1 is default
process_listings($firstPage);
所以,我对使用 APIs 还很陌生,我只是想尝试使用 Etsy API 来显示一组特定的列表。
默认情况下,API return 是一组 25 个结果,一次最多可以做 100 个。我想展示的不止于此,所以我试图在我的电话中添加分页。到目前为止,这是我得到的:
<?php
//setting API key
define("API_KEY", XXX);
//setting request url
$url = "https://openapi.etsy.com/v2/listings/active?keywords=unicorn,unicorns&includes=Images:1:0&api_key=" . API_KEY;
while (isset($url) && $url != '') {
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$response_body=curl_exec($curl);
curl_close($curl);
$response = json_decode($response_body);
foreach ($response->results as $listing) {
echo "<li>" . $listing->title . " ~*~ " . $listing->price . " " . $listing->currency_code . " ~*~ " . '<a href="' . $listing->url . '" target="_blank">View on Etsy!</a>' . "</li>" . "<br>";
}
$url = $response->pagination->next_page;
}
?>
我认为这会循环并 return 下一组 25 个结果,但事实并非如此。有人有这方面的经验吗?我有什么地方被绊倒了吗?
谢谢!
在您的 while
块中,您将 next_page
属性 的值分配给 $url
。
但实际值是 int
, 2,而不是 url.
而是将 next_page
作为查询字符串变量附加到初始 url。
$url .= "&page=" . $response->pagination->next_page;
请参阅下面的示例,了解如何将每个进程隔离为一个函数。
我们将 curl
操作移动到它自己的函数中,它 returns 来自 json_decode
的对象。
我们将列表的整个处理转移到一个单独的函数中,现在它只打印列表。
第二个函数是递归的,也就是说,如果下一页存在,它将调用第一个函数,获取响应,然后进行处理。
<?php
//setting API key
define("API_KEY", 'br4j52uzdtlcpp6qxb6we3ge');
function get_listings($page=1){
$url = "https://openapi.etsy.com/v2/listings/active?keywords=unicorn,unicorns&includes=Images:1:0&api_key=" . API_KEY;
$url .= "&page=$page";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$response_body=curl_exec($curl);
curl_close($curl);
$responseObject = json_decode($response_body);
return $responseObject;
}
function process_listings($responseObject){
foreach ($responseObject->results as $listing) {
echo "Title: " . $listing->title . PHP_EOL .
"Price " . $listing->price . PHP_EOL .
"Currency code " . $listing->currency_code . PHP_EOL .
'URL ' . $listing->url . PHP_EOL;
}
print PHP_EOL . "Pagination " . $responseObject->pagination->next_page . PHP_EOL;
$next_page = $responseObject->pagination->next_page;
if ($next_page) {
$nextPageResponse = get_listings($next_page);
process_listings($nextPageResponse);
}
}
$firstPage = get_listings(); // page 1 is default
process_listings($firstPage);