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ı okuGraphQL
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ı okuREST API ve GraphQL karşılaştırması
| Özellik | REST API | GraphQL |
|---|---|---|
| Uç noktalar | Kaynak başına bir tane, /users/42 gibi birçok URL | Tüm işlemler için genellikle /graphql gibi tek bir URL |
| Yanıt biçimi | Her uç nokta için sunucu tarafından sabitlenir | İstemci tarafından, alan alan seçilir |
| İlişkili veri | Çoğu zaman birkaç istek gerektirir | Tek bir sorgu iç içe ilişkileri izleyebilir |
| Önbellekleme | URL'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 belgelenir | Katı tipli yerleşik şema |
| Hatalar | 404 gibi HTTP durum kodlarıyla bildirilir | Çoğu zaman gövdede bir errors dizisiyle birlikte 200 OK |
| En uygun olduğu yer | Basit, önbelleğe alınabilir genel ya da servisler arası API'ler | Birç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: 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// 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.