IT-Storm

Java относится к JavaScript так же, как Сом к Сомали

Menu

Magento 2: Выполнение запросов через API

Magento 2: Выполнение запросов через API

Использование Magento\Framework\HTTP для работы с API

Библиотека Magento\Framework\HTTP предоставляет удобный способ выполнения HTTP-запросов, включая методы PUT и другие, которые не поддерживаются стандартным cURL в Magento.

Пример реализации:
use Magento\Framework\HTTP\ZendClientFactory;

private $httpClientFactory;

/**
 * Выполнение API-запроса и возврат результата
 *
 * @param string $url
 * @param array $data
 * @return Zend_Http_Response
 * @throws \Zend_Http_Client_Exception
 */
public function apiConnect(string $url, array $data = []): Zend_Http_Response
{
    $client = $this->getHttpClient();
    $client->setUri($url);
    $client->setHeaders([
        'Content-Type' => 'application/json'
    ]);

    if ($data) {
        $client->setRawData(json_encode($data), 'application/json');
        $client->setMethod($client::POST);
    }

    $response = $client->request();
    $this->checkResponse($response);

    return $response;
}

/**
 * Возвращает HTTP-клиент Zend
 *
 * @return ZendClient
 * @throws \Zend_Http_Client_Exception
 */
private function getHttpClient(): ZendClient
{
    $client = $this->httpClientFactory->create();
    $client->setConfig([
        'maxredirects' => 1,
        'timeout' => 30000
    ]);

    return $client;
}

/**
 * Проверка ответа API
 *
 * @param Zend_Http_Response $response
 * @throws \Exception
 */
private function checkResponse(Zend_Http_Response $response): void
{
    if ($response->getStatus() !== 200) {
        throw new ApiErrorException(__('API error. Response code %1', $response->getStatus()));
    }
}


Кастомный класс исключений

class ApiErrorException extends \Magento\Framework\Exception\LocalizedException

{
    const PHRASE = 'Api error.';

    public function __construct(
        \Magento\Framework\Phrase $phrase = null,
        \Exception $cause = null,
        $code = 0
    ) {
        if ($phrase === null) {
            $phrase = new \Magento\Framework\Phrase(__(self::PHRASE));
        }

        parent::__construct($phrase, $cause, $code);
    }
}

Magento 2