Мне нужно отправить асинхронный c пост-запрос в фоновом режиме и сохранить ответ (код состояния и тело запроса в БД). Я решил использовать пакет GuzzleHttp (v6) для него.
Идея состоит в том, чтобы запустить функцию sendAsyncRequest
, отправить в нее асинхронный c запрос, затем получить ответ от ресурса в массиве с ключами code
, data
, вернуть этот массив внешней функции processAsyncRequest
и затем отправить его в функцию logResponse
, чтобы сохранить его в дБ.
use GuzzleHttp\Client as GuzzleClient;
class Logger
{
public function processAsyncRequest($client)
{
$response = $this->sendAsyncRequest($client->phone, ['utm_source' => $client->utm_source]);
$this->logResponse($client, $response);
}
public function sendAsyncRequest($phone, $params)
{
$url_params = http_build_query(['utm_source' => $client->utm_source]);
$guzzleClient = new GuzzleClient();
$headers = [
'Content-Type' => 'application/json',
'Authorization' => 'Basic xxxxxxxxxx',
];
$request = new Request('POST', 'url' . $phone . '/tokens/?' . $url_params, $headers);
$promise = $guzzleClient->sendAsync($request);
$promise->then(
function (ResponseInterface $response) {
return [
'code' => $response->getStatusCode(),
'body' => $response->getBody()->__toString(),
];
},
function(RequestException $e) {
return [
'code' => $e->getResponse()->getStatusCode(),
'body' => $e->getMessage(),
];
}
);
$res = $promise->wait();
return $res;
}
public function logResponse($client, $data)
{
$log = new Log();
$log->client_id = $client->id;
$log->url = 'url';
$log->response = $data['code'] . ', ' . $data['body'];
$log->comment = 'reg';
return $log->save();
}
}
Проблемы:
функция sendAsyncRequest
возвращает объект GuzzleHttp\Psr7\Response
, Я вижу ошибку "Невозможно использовать объект типа GuzzleHttp \ Psr7 \ Response в качестве массива", и я не знаю, как получить из него массив $res
.
как правильно обработать исключение, если обещание вернет ошибку?