使用 Guzzle 时从 Do 推送请求
Push Request from a Do while using Guzzle
我的结果数组有问题,我最初想要的是这样的
$promises = [
'0' => $client->getAsync("www.api.com/opportunities?api=key&page=1fields=['fields']"),
'1' => $client->getAsync("www.api.com/opportunities?api=key&page=2fields=['fields']"),
'2' => $client->getAsync("www.api.com/opportunities?api=key&page=3fields=['fields']")
];
一组请求承诺,我将使用它,因为我想从我正在使用的 API 中检索数据集合。这是 API 第一页的样子
在我的请求中,我想获取第 2、3、4 页。
这是第 2 页的样子
我在 PHP 脚本上做了一个 do while 循环,但它似乎 运行 是一个无限循环
这就是它应该如何工作的。首先,我 运行 初始请求然后获取 totalRecordCount = 154 并将其减去 recordCount = 100 如果差异为 != 0 它再次 运行 并更改 $pageNumber 并将其推送到承诺。
这是我的函数code.Here是我的代码
function runRequest(){
$promises = [];
$client = new \GuzzleHttp\Client();
$pageCounter = 1;
$globalCount = 0;
do {
//request first and then check if has difference
$url = 'https://api.com/opportunities_dates?key='.$GLOBALS['API_KEY'].'&page='.$pageCounter.'&fields=["fields"]';
$initialRequest = $client->getAsync($url);
$initialRequest->then(function ($response) {
return $response;
});
$initialResponse = $initialRequest->wait();
$initialBody = json_decode($initialResponse->getBody());
$totalRecordCount = $initialBody->totalRecordCount;//154
$recordCount = $initialBody->recordCount;//100
$difference = $totalRecordCount - $recordCount;//54
$pageCounter++;
$globalCount += $recordCount;
array_push($promises,$url);
} while ($totalRecordCount >= $globalCount);
return $promises;
}
$a = $runRequest();
print_r($a); //contains array of endpoint like in the sample above
存在无限循环,因为当总记录数等于全局计数时,您会一直循环。第 3 页及以上页有 0 条记录,因此总数为 154。将 >=
替换为 >
将解决循环。
但是,该代码仍无法按您预期的方式运行。对于每个页面,您准备一个带有 getAsync()
的请求并立即执行 wait()
。 then
语句什么都不做。它 return 是响应,默认情况下它已经这样做了。所以实际上,这些都是同步请求。
由于页面大小是固定的,您可以根据第一次请求时给出的信息计算出您需要的页面。
function runRequest(){
$promises = [];
$client = new \GuzzleHttp\Client();
$url = 'https://api.com/opportunities_dates?key='.$GLOBALS['API_KEY'].'&fields=["fields"]';
// Initial request to get total record count and page count
$initialRequest = $client->getAsync($url.'&page=1');
$initialResponse = $initialRequest->wait();
$initialBody = json_decode($initialResponse->getBody());
$promises[] = $initialRequest;
$totalRecordCount = $initialBody->totalRecordCount;//154
$pageSize = $initialBody->pageSize;//100
$nrOfPages = ceil($totalRecordCount / $pageSize);//2
for ($page = 2; $page <= $nrOfPages; $page++) {
$promises[] = $client->getAsync($url.'&page='.$page);
}
return $promises;
}
$promises = runRequest();
$responses = \GuzzleHttp\Promise\unwrap($promises);
请注意,该函数现在 return 承诺而不是 URL 作为字符串。
第一个promise已经确定了也没关系。 unwrap
函数不会导致对第 1 页的另一个 GET 请求,但 return 现有响应。对于所有其他页面,请求是同时完成的。
我的结果数组有问题,我最初想要的是这样的
$promises = [
'0' => $client->getAsync("www.api.com/opportunities?api=key&page=1fields=['fields']"),
'1' => $client->getAsync("www.api.com/opportunities?api=key&page=2fields=['fields']"),
'2' => $client->getAsync("www.api.com/opportunities?api=key&page=3fields=['fields']")
];
一组请求承诺,我将使用它,因为我想从我正在使用的 API 中检索数据集合。这是 API 第一页的样子
在我的请求中,我想获取第 2、3、4 页。
这是第 2 页的样子
我在 PHP 脚本上做了一个 do while 循环,但它似乎 运行 是一个无限循环 这就是它应该如何工作的。首先,我 运行 初始请求然后获取 totalRecordCount = 154 并将其减去 recordCount = 100 如果差异为 != 0 它再次 运行 并更改 $pageNumber 并将其推送到承诺。
这是我的函数code.Here是我的代码
function runRequest(){
$promises = [];
$client = new \GuzzleHttp\Client();
$pageCounter = 1;
$globalCount = 0;
do {
//request first and then check if has difference
$url = 'https://api.com/opportunities_dates?key='.$GLOBALS['API_KEY'].'&page='.$pageCounter.'&fields=["fields"]';
$initialRequest = $client->getAsync($url);
$initialRequest->then(function ($response) {
return $response;
});
$initialResponse = $initialRequest->wait();
$initialBody = json_decode($initialResponse->getBody());
$totalRecordCount = $initialBody->totalRecordCount;//154
$recordCount = $initialBody->recordCount;//100
$difference = $totalRecordCount - $recordCount;//54
$pageCounter++;
$globalCount += $recordCount;
array_push($promises,$url);
} while ($totalRecordCount >= $globalCount);
return $promises;
}
$a = $runRequest();
print_r($a); //contains array of endpoint like in the sample above
存在无限循环,因为当总记录数等于全局计数时,您会一直循环。第 3 页及以上页有 0 条记录,因此总数为 154。将 >=
替换为 >
将解决循环。
但是,该代码仍无法按您预期的方式运行。对于每个页面,您准备一个带有 getAsync()
的请求并立即执行 wait()
。 then
语句什么都不做。它 return 是响应,默认情况下它已经这样做了。所以实际上,这些都是同步请求。
由于页面大小是固定的,您可以根据第一次请求时给出的信息计算出您需要的页面。
function runRequest(){
$promises = [];
$client = new \GuzzleHttp\Client();
$url = 'https://api.com/opportunities_dates?key='.$GLOBALS['API_KEY'].'&fields=["fields"]';
// Initial request to get total record count and page count
$initialRequest = $client->getAsync($url.'&page=1');
$initialResponse = $initialRequest->wait();
$initialBody = json_decode($initialResponse->getBody());
$promises[] = $initialRequest;
$totalRecordCount = $initialBody->totalRecordCount;//154
$pageSize = $initialBody->pageSize;//100
$nrOfPages = ceil($totalRecordCount / $pageSize);//2
for ($page = 2; $page <= $nrOfPages; $page++) {
$promises[] = $client->getAsync($url.'&page='.$page);
}
return $promises;
}
$promises = runRequest();
$responses = \GuzzleHttp\Promise\unwrap($promises);
请注意,该函数现在 return 承诺而不是 URL 作为字符串。
第一个promise已经确定了也没关系。 unwrap
函数不会导致对第 1 页的另一个 GET 请求,但 return 现有响应。对于所有其他页面,请求是同时完成的。