Magento 2: API запрос метод PUT
Пример получения данных в результате выполнения API запроса в контроллере Magento 2.
declare(strict_types=1);
namespace ITStorm\ApiTest\Controller\Adminhtml\Send;
use Magento\Backend\App\Action;
use Magento\Framework\App\ResponseInterface;
use Magento\Framework\Controller\ResultFactory;
use Magento\Backend\App\Action\Context;
use Magento\Framework\Controller\ResultInterface;
use Magento\Framework\HTTP\ZendClient;
use Psr\Log\LoggerInterface;
use Magento\Framework\HTTP\ZendClientFactory;
use Zend_Http_Response;
class ApiTesting extends Action
{
public const API_URL = 'https://www.your-api.com';
/**
* @var LoggerInterface
*/
private LoggerInterface $logger;
/**
* @var ZendClientFactory
*/
private ZendClientFactory $httpClientFactory;
/**
* ApiTesting constructor.
* @param Context $context
* @param LoggerInterface $logger
* @param ZendClientFactory $httpClientFactory
*/
public function __construct(
Context $context,
LoggerInterface $logger,
ZendClientFactory $httpClientFactory
) {
$this->logger = $logger;
$this->httpClientFactory = $httpClientFactory;
parent::__construct($context);
}
/**
* Получаем данные API запросом
*
* @return ResponseInterface|ResultInterface
*/
public function execute()
{
$data[
'prodSomeId' => 12345;
'brand' => 'Sony';
];
try {
$apiResponse = $this->apiConnect(self::API_URL, $data, ZendClient::PUT);
$apiData = $this->json->unserialize($apiResponse->getBody());
} catch (\Exception $e) {
$this->logger->warning('ITStorm_ApiTest: ' . $e->getMessage());
}
// Do something ...
return $response;
}
/**
* Perform API request and return result
*
* @param string $url
* @param array $data
* @return Zend_Http_Response
* @throws \Zend_Http_Client_Exception
*/
public function apiConnect(string $url, array $data = [], string $method = ZendClient::GET): 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($method);
}
$response = $client->request();
$this->checkResponse($response);
return $response;
}
private function getHttpClient(): ZendClient
{
$client = $this->httpClientFactory->create();
$client->setConfig([
'maxredirects' => 1,
'timeout' => 30000
]);
return $client;
}
/**
* Check response
*
* @param Zend_Http_Response $response
* @throws \Exception
* @return void
*/
private function checkResponse(Zend_Http_Response $response): void
{
if ($response->getStatus() !== 200) {
throw new ApiErrorException(__('API error. Response code %1', $response->getStatus()));
}
}
}