Ana içeriğe geç

Yan yana

REST APIvsGraphQL

REST ile GraphQL arasındaki fark nedir?

Güncellendi 2 dk okuma7 fark

Kısaca

REST, her biri sabit biçimde veri döndüren birçok URL sunar; GraphQL ise istemcinin tam olarak ihtiyaç duyduğu alanları istediği tek bir endpoint sunar.

REST API

Representational State Transfer API

REST API, verileri URL'lerle tanımlanan kaynaklar olarak sunan ve istemcilerin onları standart HTTP metotlarıyla okuyup değiştirmesini sağlayan web API'sidir.

REST API sayfasını oku

GraphQL

GraphQL, istemcilerin tam ihtiyaç duyduğu veriyi, çoğunlukla tek bir endpoint üzerinden tek istekte istemesini sağlayan API sorgu dili ve çalışma zamanıdır.

GraphQL sayfasını oku

REST API ve GraphQL karşılaştırması

ÖzellikREST APIGraphQL
Uç noktalarKaynak başına bir tane, /users/42 gibi birçok URLTüm işlemler için genellikle /graphql gibi tek bir URL
Yanıt biçimiHer uç nokta için sunucu tarafından sabitlenirİstemci tarafından, alan alan seçilir
İlişkili veriÇoğu zaman birkaç istek gerektirirTek bir sorgu iç içe ilişkileri izleyebilir
ÖnbelleklemeURL'ye göre standart HTTP önbellekleme ile kolayİstemci tarafı önbellekler ya da kalıcı sorgular gerekir
Tiplemeİsteğe bağlı; çoğunlukla OpenAPI ile belgelenirKatı tipli yerleşik şema
Hatalar404 gibi HTTP durum kodlarıyla bildirilirÇoğu zaman gövdede bir errors dizisiyle birlikte 200 OK
En uygun olduğu yerBasit, önbelleğe alınabilir genel ya da servisler arası API'lerBirçok kaynaktan veriyi birleştiren zengin ön yüzler

Fark, açıklamalı

REST, her kaynağın (bir kullanıcı ya da sipariş gibi) kendi URL'sine sahip olduğu ve GET ile POST gibi standart HTTP metotlarıyla okunup değiştirildiği bir web API mimari tarzıdır. GraphQL ise API'ler için bir sorgu dili ve çalışma ortamıdır: sunucu tipli bir şema yayımlar, istemciler de istedikleri verinin tam tarifini içeren sorgular gönderir.

Temel fark, yanıtın biçimine kimin karar verdiğidir. REST'te her uç noktanın ne döndüreceğini sunucu belirler; bu yüzden bir ekran birkaç istek gerektirebilir ya da hiç kullanmadığı alanları alabilir, buna eksik çekme (under-fetching) ve fazla çekme (over-fetching) denir. GraphQL'de alanları istemci seçer ve ilişkileri tek istekte izleyebilir; bu yüzden birçok farklı ekranı ve istemcisi olan uygulamalarda popüler oldu.

Birbirlerini dışlamazlar. İkisi de genellikle HTTP üzerinde çalışır ve JSON döndürür; birçok ekip basit genel ya da servisler arası API'ler için REST'i korurken, ön yüzleri için birkaç arka ucun önüne bir GraphQL katmanı koyar. GraphQL işin bir kısmını sunucuya kaydırır: resolver'ların N+1 sorgu sorunundan kaçınması gerekir, önbellekleme ve hız sınırlama da düz URL'lere göre daha fazla düşünmeyi gerektirir.

Sık yapılan bir yanlış, GraphQL'in REST'in yerini aldığı ya da her zaman daha hızlı olduğu düşüncesidir. İç içe karmaşık veriler için gidiş-dönüşleri azaltır; ama basit CRUD API'lerinde REST'i kurmak, önbelleğe almak ve hatasını ayıklamak çoğu zaman daha kolaydır ve tek bir pahalı GraphQL sorgusu birkaç küçük REST çağrısından daha yavaş olabilir.

Hangisini kullanmalısınız?

REST API şu durumlarda doğru seçim:

  • API'niz iyi tanımlanmış kaynaklar üzerinde basit CRUD işlemlerinden oluşuyor.
  • HTTP önbellekleme, CDN'ler ve durum kodlarının kutudan çıktığı gibi çalışmasını istiyorsunuz.
  • API herkese açık ve düz HTTP araçlarıyla kolayca çağrılabilmeli.
  • Servisler kararlı, öngörülebilir veri yükleri (payload) alışverişi yapıyor.

GraphQL şu durumlarda doğru seçim:

  • Birçok istemcinin ya da ekranın aynı verinin farklı dilimlerine ihtiyacı var.
  • Bir görünüm, birkaç REST çağrısı gerektirecek iç içe, ilişkili veriye ihtiyaç duyuyor.
  • Ön yüzlerin keşfedip doğrulayabileceği güçlü tipli bir şema istiyorsunuz.
  • Birkaç arka uç servisinin önüne tek bir API koyuyorsunuz.

Bir kullanıcıyı ve gönderilerini yüklemek

REST APIjavascript
// REST: one request per resource
const user = await fetch("/api/users/42").then((r) => r.json());
const posts = await fetch("/api/users/42/posts").then((r) => r.json());

// Each response contains every field the server chose to include
GraphQLjavascript
// GraphQL: one request, only the fields you ask for
const res = await fetch("/graphql", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    query: "{ user(id: 42) { name posts { title } } }",
  }),
});
const { data } = await res.json();

Sık sorulan sorular

GraphQL, REST'ten daha mı hızlı?

Kendiliğinden değil. GraphQL iç içe veriler için gidiş-dönüş sayısını azaltabilir; ama her sorgu sunucuya daha pahalıya gelebilir ve REST yanıtlarını önbelleğe almak daha kolaydır.

REST ve GraphQL birlikte kullanılabilir mi?

Evet. Yaygın bir kurulumda mevcut REST servisleri korunur ve onları çağıran bir GraphQL katmanı eklenir; böylece arka uçlar değişmeden kalırken ön yüzler tek ve esnek bir API elde eder.

GraphQL özel bir veritabanı gerektirir mi?

Hayır. GraphQL yalnızca bir API katmanıdır; resolver'ları herhangi bir veritabanından, REST API'sinden ya da başka bir servisten okuyabilir.

Daha fazla

Ayarlar