проблема с несколькими HTTP-запросами в Laravel с Guzzle - PullRequest
0 голосов
/ 16 октября 2019

Я использую версию Guzzle 6.3.3. Я хочу сделать несколько HTTP-запросов от внешнего API. Код, показанный ниже рабочий идеально подходит для меня. Это всего лишь один запрос.

public function getAllTeams()
{
    $client = new Client();
    $uri = 'https://api.football-data.org/v2/competitions/2003/teams';
    $header = ['headers' => ['X-Auth-Token' => 'MyKey']];
    $res = $client->get($uri, $header);
    $data = json_decode($res->getBody()->getContents(), true);
    return $data['teams'];
}

Но теперь я хочу сделать несколько запросов одновременно. В документации по Guzzle я узнал, как это сделать, но все равно он не работал должным образом. Это код, который я пытаюсь использовать.

    $header = ['headers' => ['X-Auth-Token' => 'MyKey']];
    $client = new Client(['debug' => true]);
    $res = $client->send(array(
        $client->get('https://api.football-data.org/v2/teams/666', $header),
        $client->get('https://api.football-data.org/v2/teams/1920', $header),
        $client->get('https://api.football-data.org/v2/teams/6806', $header)
    ));
    $data = json_decode($res->getBody()->getContents(), true);
    return $data;

Я получаю сообщение об ошибке:

Argument 1 passed to GuzzleHttp\Client::send() must implement interface Psr\Http\Message\RequestInterface, array given called in TeamsController.

Если я удаляю $header после каждого URI я получаю эту ошибку:

resulted in a '403 Forbidden' response: {"message": "The resource you are looking for is restricted. Please pass a valid API token and check your subscription fo (truncated...)

Я пробовал несколько способов установить X-Auth-Token с помощью моего ключа API. Но я все еще получаю ошибки, и я не знаю многих других способов с их помощью Guzzle.

Я надеюсь, что кто-то может мне помочь:)

1 Ответ

0 голосов
/ 17 октября 2019

Guzzle 6 использует другой подход к Guzzle 3, поэтому вы должны использовать что-то вроде:

use function GuzzleHttp\Promise\all;

$header = ['headers' => ['X-Auth-Token' => 'MyKey']];
$client = new Client(['debug' => true]);
$responses = all([
    $client->getAsync('https://api.football-data.org/v2/teams/666', $header),
    $client->getAsync('https://api.football-data.org/v2/teams/1920', $header),
    $client->getAsync('https://api.football-data.org/v2/teams/6806', $header)
])->wait();
$data = [];
foreach ($responses as $i => $res) {
    $data[$i] = json_decode($res->getBody()->getContents(), true);
}
return $data;

Взгляните на разные вопросы на одну и ту же тему ( # 1 , # 2 ), чтобы увидеть больше примеров использования.

...