Налаштування 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 днів.







