2017-10-12 14 views
0

여기 내 문제가 있습니다 :
Spotify는 모든 사용자의 저장된 트랙을 반환하지 않습니다. 반송 트랙 수에 대한 제한은 50입니다 (여기에 API).구근에 복수 요청


모든 사용자의 저장된 트랙을 반환하는 해결책을 찾았습니다 (사용 된 루프 do-while). 그것은 많은 요청을합니다 (내 경우에는 ~ 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

당신이 할 수있는 일은 (afaik는 Spotify가 트랙 카운트를 노출하기위한 엔드 포인트를 가지고있는 것처럼 보이지 않습니다.) 하나의 초기 요청 (아마 하나의 레코드로 제한됩니까?)입니다. 그러면 json의 총 카운트가 반환됩니다. 이것으로부터 당신은 전체를 보여줄 필요가있는 전체 페이지 수와 페이지 수에 기초하여 필요한 요청 수를 산출 할 수 있습니다. –

답변

1

해당 조건에 의존하지 마십시오. 항목이 null이 아니거나 사용자가 가진 총 항목 수를 계산하고 total 항목과 비교하십시오.


스포티 파이 응답 주위 매김 래퍼 엔트리 total 번호를 공개한다. 처음 50 개의 항목으로 첫 번째 요청을 한 다음 남은 모든 청크에 대해 동시 요청을 할 수 있습니다. 그 시점에서 총 수를 알고 있기 때문입니다.

추가 요청에는 asyncRequest()을 사용해야하며 약속을 반환하고 나머지 요청은 모두 예약해야합니다. 그런 다음 wait() 인스턴스 메소드를 사용하여 약속을 순차적으로 기다릴 수 있습니다. wait() 호출 순서는 중요하지 않습니다. 왜냐하면 wait()이 내부 이벤트 루프를 체크하고 요청에 대해 진행하기 때문입니다. 더 나아가서 wait() 호출은 어느 쪽이든 짧게 실행하거나 즉시 해결할 수 있습니다.

URL에 next 항목을 의지 할 수있는 대신 수동으로 URL을 구성해야합니다.

몇 가지 동시성 제한을 추가하는 것이 좋습니다. Spotify는 이에 대한 몇 가지 지침을 가지고있을 것입니다. Guzzle은이를 위해 Pool 구현을 제공합니다.