Настройка Magento 2 REST/GraphQL API
Magento 2 имеет мощный API из коробки. REST API охватывает все сущности: товары, заказы, клиентов, корзины. GraphQL API (Magento 2.3+) — для фронтенда и PWA. Оба требуют настройки аутентификации и понимания структуры ресурсов.
REST API: аутентификация
Token-based (клиент/пользователь):
# Получить токен администратора
curl -X POST https://shop.com/rest/V1/integration/admin/token \
-H "Content-Type: application/json" \
-d '{"username": "admin", "password": "admin_pass"}'
# Ответ: "abc123token..."
# Получить токен клиента
curl -X POST https://shop.com/rest/V1/integration/customer/token \
-H "Content-Type: application/json" \
-d '{"username": "[email protected]", "password": "pass"}'
OAuth 1.0a (для интеграций): Магазин → System → Integrations → Add New Integration → Resource Access: выбрать нужные ресурсы → получить Consumer Key/Secret, Access Token/Secret.
REST API: работа с товарами
# Получить список товаров с фильтрацией
curl -X GET "https://shop.com/rest/V1/products?searchCriteria[filter_groups][0][filters][0][field]=price&searchCriteria[filter_groups][0][filters][0][value]=100&searchCriteria[filter_groups][0][filters][0][condition_type]=gt&searchCriteria[pageSize]=20" \
-H "Authorization: Bearer ADMIN_TOKEN"
# Создать товар
curl -X POST https://shop.com/rest/V1/products \
-H "Authorization: Bearer ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"product": {
"sku": "LAPTOP-001",
"name": "Ноутбук 15",
"price": 75000,
"status": 1,
"type_id": "simple",
"attribute_set_id": 4,
"custom_attributes": [
{"attribute_code": "description", "value": "<p>Описание</p>"},
{"attribute_code": "short_description", "value": "Краткое описание"}
]
}
}'
# Обновить остаток
curl -X PUT "https://shop.com/rest/V1/products/LAPTOP-001/stockItems/1" \
-H "Authorization: Bearer ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"stockItem": {"qty": 50, "is_in_stock": true}}'
REST API: заказы
# Список заказов
curl "https://shop.com/rest/V1/orders?searchCriteria[filter_groups][0][filters][0][field]=status&searchCriteria[filter_groups][0][filters][0][value]=pending" \
-H "Authorization: Bearer ADMIN_TOKEN"
# Изменить статус заказа
curl -X POST "https://shop.com/rest/V1/orders/123/comments" \
-H "Authorization: Bearer ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"statusHistory": {"comment": "Заказ отгружен", "is_customer_notified": 1, "is_visible_on_front": 1, "status": "complete"}}'
GraphQL API
GraphQL API Magento 2 оптимизирован для PWA/headless-фронтендов:
# Поиск товаров
query SearchProducts($search: String!, $pageSize: Int) {
products(search: $search, pageSize: $pageSize) {
total_count
items {
id
sku
name
price_range {
minimum_price {
regular_price { value currency }
final_price { value currency }
}
}
image { url label }
... on ConfigurableProduct {
configurable_options {
label
values { label value_index }
}
}
}
}
}
# Корзина
mutation CreateCart {
createGuestCart
}
mutation AddToCart($cartId: String!, $sku: String!, $qty: Float!) {
addSimpleProductsToCart(input: {
cart_id: $cartId
cart_items: [{
data: { sku: $sku, quantity: $qty }
}]
}) {
cart {
items { id quantity product { sku name } prices { price { value } } }
prices { grand_total { value currency } }
}
}
}
Кастомный REST API модуль
// Api/ProductStatsInterface.php
interface ProductStatsInterface {
public function getStats(string $sku): array;
}
// registration.php + module.xml ...
// Model/ProductStats.php
class ProductStats implements ProductStatsInterface {
public function __construct(
private readonly ProductRepositoryInterface $productRepository,
private readonly StockRegistryInterface $stockRegistry
) {}
public function getStats(string $sku): array {
$product = $this->productRepository->get($sku);
$stock = $this->stockRegistry->getStockItemBySku($sku);
return [
'sku' => $sku,
'name' => $product->getName(),
'price' => $product->getFinalPrice(),
'qty' => $stock->getQty(),
'in_stock' => $stock->getIsInStock(),
];
}
}
// etc/webapi.xml
// <route url="/V1/products/:sku/stats" method="GET">
// <service class="Vendor\Module\Api\ProductStatsInterface" method="getStats"/>
// <resources><resource ref="Magento_Catalog::products"/></resources>
// </route>
Rate Limiting и производительность
Magento REST API без кэша нагружает сервер. Рекомендации:
- Включить Varnish перед Magento (Full Page Cache)
- Для публичных эндпоинтов — Nginx-кэш на уровне location
- Использовать Async REST API (POST
/async/V1/products) для массовых обновлений
Сроки
Настройка OAuth-интеграции + 5–10 REST-эндпоинтов — 5–7 дней. Разработка кастомного GraphQL-модуля — плюс 3–5 дней.







