diff --git a/README.md b/README.md index 5ff804e..25c633c 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,28 @@ $apiClient = new \AmoCRM\Client\AmoCRMApiClient($clientId, $clientSecret, $redir $apiClient = $apiClient->setUserAgnet('App Name'); ``` +### Установка кастомного callback-обработчика ответа от сервера +Начиная с версии 1.9.0 появилась возможность устанавливать callback-обработчик ответа от сервера. + +Вы можете установить функцию-callback на событие обработки ответа, если есть необходимость в дополнительной логике (например логировать ответ от сервера или же переопределить обработку 204 кода ответа). + +Если нет необходимости в отработке стандартной логики обработки ответа, то callback должен возвращать true + +```php +$apiClient = new \AmoCRM\Client\AmoCRMApiClient($clientId, $clientSecret, $redirectUri); + +$this->apiClient + ->setCheckHttpStatusCallback( + function (ResponseInterface $response, $decodedBody) { + if ($response->getStatusCode() === 204) { + return true; + } + + $this->logger->info('Response: ', $decodedBody); + } + ); +``` + ## Авторизация с долгоживущим токеном Не так давно в amoCRM появилась возможность создавать долгоживущие токены. Их можно легко использовать с этой библиотекой. diff --git a/src/AmoCRM/Client/AmoCRMApiClient.php b/src/AmoCRM/Client/AmoCRMApiClient.php index b32483a..dfe9e91 100644 --- a/src/AmoCRM/Client/AmoCRMApiClient.php +++ b/src/AmoCRM/Client/AmoCRMApiClient.php @@ -91,6 +91,11 @@ class AmoCRMApiClient */ private $refreshAccessTokenCallback; + /** + * @var callable|null + */ + private $checkHttpStatusCallback; + /** * AmoCRMApiClient constructor. * @@ -199,6 +204,20 @@ public function setRefreshAccessTokenCallback(callable $callable): self return $this; } + /** + * Устанавливаем callback, который будет вызван при обработке ответа от сервера. + * Если нет необходимости в отработке стандартной логики обработки ответа, то callback должен возвращать true + * + * @param callable $callable + * @return $this + */ + public function setCheckHttpStatusCallback(callable $callable): self + { + $this->checkHttpStatusCallback = $callable; + + return $this; + } + /** * Метод строит объект для совершения запросов для сервисов сущностей * @@ -235,6 +254,10 @@ function (AccessToken $accessToken, string $baseAccountDomain) use ($oAuthClient $request->setRefreshAccessTokenCallback($this->refreshAccessTokenCallback); } + if ($this->checkHttpStatusCallback !== null) { + $request->setCustomCheckStatusCallback($this->checkHttpStatusCallback); + } + return $request; } diff --git a/src/AmoCRM/Client/AmoCRMApiRequest.php b/src/AmoCRM/Client/AmoCRMApiRequest.php index 76bc0c2..be57209 100644 --- a/src/AmoCRM/Client/AmoCRMApiRequest.php +++ b/src/AmoCRM/Client/AmoCRMApiRequest.php @@ -36,7 +36,7 @@ class AmoCRMApiRequest public const CONNECT_TIMEOUT = 5; public const REQUEST_TIMEOUT = 20; //TODO Do not forget to change this on each release - public const LIBRARY_VERSION = '1.8.1'; + public const LIBRARY_VERSION = '1.9.0'; public const USER_AGENT = 'amoCRM-API-Library/' . self::LIBRARY_VERSION; public const SUCCESS_STATUSES = [ @@ -112,6 +112,11 @@ class AmoCRMApiRequest */ private $refreshAccessTokenCallback; + /** + * @var callable|null + */ + private $customCheckHttpStatusCallback; + /** * AmoCRMApiRequest constructor. * @@ -141,6 +146,12 @@ public function setRefreshAccessTokenCallback(callable $callback): void $this->refreshAccessTokenCallback = $callback; } + public function setCustomCheckStatusCallback(callable $callback): void + { + $this->customCheckHttpStatusCallback = $callback; + } + + /** * Обновляем в библиотеке oAuth access токен по refresh * @throws AmoCRMoAuthApiException @@ -569,6 +580,15 @@ public function get( protected function checkHttpStatus(ResponseInterface $response, $decodedBody = []): void { $this->lastResponseCode = $response->getStatusCode(); + + if ( + $this->customCheckHttpStatusCallback !== null + && is_callable($this->customCheckHttpStatusCallback) + && ($this->customCheckHttpStatusCallback)($response, $decodedBody) === true + ) { + return; + } + if ((int)$response->getStatusCode() === StatusCodeInterface::STATUS_UNAUTHORIZED) { throw new AmoCRMoAuthApiException( "Unauthorized",