Magento 2 REST API vs GraphQL — performance vergeleken
Terug naar blog

Magento 2 REST API vs GraphQL — performance vergeleken

AuthorRuthger Idema
17 april 202611 min leestijd

GraphQL haalt 60% minder data op dan REST bij een productdetailpagina. Maar REST is sneller bij eenvoudige operaties. De keuze hangt af van je use case, niet van hype.

Magento 2 REST API vs GraphQL — performance vergeleken

GraphQL is niet automatisch beter dan REST. En REST is niet automatisch langzamer. De keuze hangt af van je use case, je team en je architectuur. Wij hebben beide APIs gemeten op dezelfde Magento 2.4 installatie. Dit zijn de resultaten.

Wat je leert in dit artikel

  • Hoe REST en GraphQL in Magento 2 technisch verschillen
  • Benchmarks: response times en payload sizes
  • Caching: waar REST wint van GraphQL
  • Wanneer je REST kiest en wanneer GraphQL
  • Praktische code-voorbeelden voor beide APIs

Technische achtergrond

Magento 2 heeft beide APIs ingebouwd:

  • REST API — beschikbaar via /rest/V1/, volgt RESTful conventies, response in JSON of XML
  • GraphQL — beschikbaar via /graphql, één endpoint, client bepaalt welke velden worden teruggegeven

De fundamentele architectuurregel verschilt: REST geeft een vaste response-structuur terug, GraphQL geeft precies terug wat de client vraagt.

Benchmark-setup

Server: 8 vCPU, 32GB RAM, NVMe SSD, Ubuntu 22.04 Magento versie: 2.4.6-p3 met Elasticsearch 8 Catalogus: 15.000 producten, 45 categorieën Cache: Redis voor object cache, Varnish voor full-page cache (uitgeschakeld voor deze tests) Meetmethode: 100 requests per test, mediaan response time, Apache Bench

Benchmark resultaten

Productdetailpagina ophalen

Een productdetailpagina vereist: naam, prijs, SKU, beschrijving, afbeeldingen, attributen, stock-status.

REST API:
bash
GET /rest/V1/products/SKU-12345

Magento geeft hier de volledige product-resource terug — inclusief alle velden die je niet nodig hebt.

GraphQL:
graphql
{
  products(filter: { sku: { eq: "SKU-12345" } }) {
    items {
      name
      sku
      price_range {
        minimum_price {
          regular_price { value currency }
        }
      }
      description { html }
      media_gallery { url label }
      stock_status
    }
  }
}
MetingREST APIGraphQL
Mediaan response time142ms118ms
Payload grootte24.8 KB9.2 KB
Payload reductie63% kleiner
P95 response time198ms165ms

GraphQL is hier 17% sneller en stuurt 63% minder data. Het verschil in snelheid is voor een groot deel te verklaren door de kleinere payload die geserialiseerd en verstuurd moet worden.

Categoriepagina met productlijst (20 producten)

REST API:
bash
GET /rest/V1/products?searchCriteria[filter_groups][0][filters][0][field]=category_id&searchCriteria[filter_groups][0][filters][0][value]=15&searchCriteria[pageSize]=20
GraphQL:
graphql
{
  categoryList(filters: { ids: { eq: "15" } }) {
    products(pageSize: 20, currentPage: 1) {
      items {
        name
        sku
        url_key
        price_range {
          minimum_price {
            regular_price { value }
          }
        }
        small_image { url label }
        stock_status
      }
    }
  }
}
MetingREST APIGraphQL
Mediaan response time389ms298ms
Payload grootte187 KB48 KB
Payload reductie74% kleiner
P95 response time512ms387ms

Bij een productlijst is het verschil groter: 23% sneller met GraphQL, 74% minder data.

Simpele operaties: winkelwagen toevoegen

REST API:
bash
POST /rest/V1/carts/mine/items
{
  "cartItem": {
    "quote_id": "abc123",
    "sku": "SKU-001",
    "qty": 1
  }
}
GraphQL:
graphql
mutation {
  addProductsToCart(
    cartId: "abc123"
    cartItems: [{ quantity: 1, sku: "SKU-001" }]
  ) {
    cart {
      items { quantity product { name } }
      prices { grand_total { value } }
    }
  }
}
MetingREST APIGraphQL
Mediaan response time87ms94ms
Payload grootte1.2 KB0.8 KB

Bij simpele schrijfoperaties is REST iets sneller. GraphQL heeft overhead door query-parsing.

Caching: het grote verschil

Hier wint REST in veel gevallen. REST requests zijn cacheable via standaard HTTP-caching. Varnish, Fastly, Cloudflare — ze werken allemaal natively met REST GET-requests.

GraphQL gebruikt standaard POST-requests. POST-requests zijn per HTTP-specificatie niet cacheable. Varnish slaat ze niet op.

Workarounds voor GraphQL-caching:
  1. Persisted queries — Sla de query op aan de serverzijde en stuur alleen een hash mee. Maakt GET-requests mogelijk.
  2. Magento's ingebouwde GraphQL-cache — Magento cachet GraphQL-responses in Redis, maar dit is alleen effectief voor identieke queries.
  3. Edge caching op CDN-niveau — Cloudflare en Fastly bieden GraphQL-specific caching, maar dat vereist configuratie.
bash
# Persisted query voorbeeld
GET /graphql?hash=abc123def456

# In plaats van
POST /graphql
{ "query": "{ products(filter:...) { items { name sku } } }" }

Met persisted queries en een goed ingesteld CDN haal je dezelfde cache-hit ratios als REST. Maar het is meer werk om op te zetten.

Wanneer REST gebruiken

REST is de betere keuze als:

  • Je server-to-server integraties bouwt — ERP-koppelingen, PIM-integraties, ordermanagementsystemen. Deze systemen halen specifieke resources op, niet variabele datavelden.
  • Je caching wilt maximaliseren — REST + Varnish is de eenvoudigste route naar maximale cache-performance.
  • Je team REST beter kent — Een bekende API is productiever dan een snellere API die niemand kent.
  • Je schrijfoperaties doet — REST mutaties zijn eenvoudiger te debuggen en te loggen.
bash
# Praktisch voorbeeld: order ophalen via REST (server-to-server)
curl -X GET \
  'https://winkel.nl/rest/V1/orders/12345' \
  -H 'Authorization: Bearer {admin_token}'

Wanneer GraphQL gebruiken

GraphQL is de betere keuze als:

  • Je een headless frontend bouwt — React, Next.js, Vue — frontends die per pagina exact de benodigde data ophalen. GraphQL is hiervoor gebouwd.
  • Je Hyva Theme gebruikt — Hyva is specifiek gebouwd op Magento's GraphQL API.
  • Je mobiele app bouwt — Minder data = lagere mobiele datakostenboekhouding en snellere laadtijden op trage verbindingen.
  • Je backend for frontend (BFF) patroon gebruikt — Een BFF-laag die data aggregeert voor een specifieke client past perfect bij GraphQL.
graphql
# Praktisch voorbeeld: mini-cart data voor React component
query GetMiniCart($cartId: String!) {
  cart(cart_id: $cartId) {
    items {
      id
      quantity
      product {
        name
        thumbnail { url }
        price_range {
          minimum_price {
            regular_price { value currency }
          }
        }
      }
    }
    prices {
      grand_total { value currency }
      subtotal_excluding_tax { value }
    }
    total_quantity
  }
}

GraphQL performance optimaliseren

Als je voor GraphQL kiest, zijn er twee quick wins:

1. Query complexity limits instellen

Magento heeft ingebouwde bescherming tegen te complexe queries:

php
// In app/etc/env.php
'graphql' => [
    'query_complexity_limit' => 300,
    'query_depth_limit' => 20,
],
2. N+1 query-probleem vermijden

GraphQL heeft een inherent N+1 probleem: voor elke item in een lijst wordt een aparte query gedaan. Magento lost dit op met DataLoaders, maar controleer of jouw custom resolvers dit ook doen.

php
// Fout: N+1 queries
public function resolve(Field $field, $context, ResolveInfo $info, array $value = null, array $args = null)
{
    // Dit genereert een query per product
    return $this->productRepository->getById($value['product_id']);
}

// Correct: gebruik de BatchedDataProvider
public function resolve(Field $field, $context, ResolveInfo $info, array $value = null, array $args = null)
{
    return $this->batchedProductLoader->load($value['product_id']);
}

Samenvatting: de beslisboom

SituatieAanbeveling
Headless frontend (React/Next.js)GraphQL
Hyva ThemeGraphQL
ERP/PIM integratieREST
Mobiele appGraphQL
Server-to-server importsREST
Maximale Varnish-cachingREST
B2B portal met complexe dataGraphQL
Simpele CRUD-operatiesREST

Conclusie

GraphQL wint op payload-grootte en flexibility. REST wint op eenvoud en native HTTP-caching. De beste keuze hangt af van je architectuur, niet van hype.

Voor headless en Hyva: GraphQL. Voor integraties en eenvoudige use cases: REST. In een complexe architectuur kun je beide naast elkaar gebruiken — REST voor backend-integraties, GraphQL voor de frontend.

Meer weten over de Magento 2 GraphQL API en hoe je die optimaal inzet? Lees onze GraphQL-gids. Bekijk ook onze Magento 2 diensten voor een volledig overzicht van wat wij doen.


Wil je weten welke API-aanpak het beste past bij jouw Magento-project? Neem contact op voor een vrijblijvend gesprek.
Ruthger Idema

Geschreven door Ruthger Idema

15+ jaar ervaring in e-commerce development. Gespecialiseerd in Magento, Shopify en Laravel maatwerk.

Meer over ons team →
Deel dit artikel:

Wil je jouw e-commerce naar het volgende niveau?

Plan een vrijblijvend gesprek met onze experts over Magento, Shopify of Laravel maatwerk.

Plan een Tech Check