这是我的问题:
Spotify不会返回所有用户保存的曲目。返回曲目的数量有限制 - 50(这里是API)。
我找到了一个返回所有用户保存曲目的解决方案(使用循环播放)。它提出了很多请求(在我的情况下是~17次 - 814首曲目)但是我的页面从6秒加载到8秒。
我读到了Concurrent requests,但我不知道在我的情况下如何使用这个和异步请求,因为在我的情况下,没有已知数量的请求。只有当返回的曲目(项目)的数量为0时,循环才会结束。你能解决我的问题吗?
<?php
namespace AppBundle\Service;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use HWI\Bundle\OAuthBundle\Security\Core\Authentication\Token\OAuthToken;
use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class SpotifyRequester
{
protected $client;
protected $tokenStorage;
public function __construct(TokenStorageInterface $tokenStorage)
{
$this->tokenStorage = $tokenStorage;
$this->client = new Client();
}
public function getSavedTracks()
{
$token = $this->getToken(); // true token
$offset = 0;
do {
$response = $this->client->request('GET',
'https://api.spotify.com/v1/me/tracks?limit=50&offset=' . $offset, [
'headers' => [
'Authorization:' => 'Bearer ' . $token,
'Accept:' => 'application/json',
'Content-Type:' => 'application/json',
]
]);
// Response from current request
$content = json_decode($response->getBody()->getContents(), true);
$offset += count($content['items']);
}
while (count($content['items']) != 0);
// Count of tracks
return $offset;
}
}
答案 0 :(得分:1)
不要依赖这种情况。要么依赖next
条目不是null
,要么计算您拥有的条目总数,并将其与total
条目进行比较。
Spotify在响应周围的分页包装中公开total
个条目。您可以使用前50个条目发出第一个请求,然后对所有剩余的块进行并发请求,因为您知道该点的总数。
您必须使用asyncRequest()
作为进一步的请求,这将返回一个承诺,并安排所有剩余的请求。然后,您可以使用wait()
实例方法按顺序等待promise。 wait()
来电的顺序并不重要,因为wait()
会勾选内部事件循环并为您的任何请求取得进展。所有进一步的wait()
次呼叫都可以缩短运行时间,甚至可以立即解决。
不幸的是,您必须手动构建网址,而不是依赖于网址的next
条目。
我建议添加一些并发限制,Spotify可能有一些指导方针。 Guzzle为此提供Pool
实现。