GraphQL ve REST Karşılaştırması
GraphQL'in ne zaman REST'ten daha iyi olduğunu ve nedenini anlayın.
GraphQL ve REST Karşılaştırması, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.
GraphQL Neden?
PHP ile REST API'lerini nasıl kullanıma sunacağınızı zaten biliyorsunuz. GraphQL, HTTP'nin yerine geçmez ve sihirli bir çözüm değildir; istemcinin tam olarak neye ihtiyacı olduğunu açıklamasını ve tek bir gidiş-dönüşte tam olarak bunu almasını sağlayan bir sorgu dili ve tür sistemidir.
Bu derste iki yaklaşımı dürüstçe karşılaştıracağız: GraphQL'in gerçekten üstün olduğu yerleri, REST'in hâlâ doğru tercih olduğu durumları ve GraphQL'in işletim açısından size neye mal olduğunu.
Gereğinden Fazla ve Yetersiz Veri Çekme
REST'in klasik sorunları:
- Gereğinden fazla veri çekme:
GET /users/1, kullanıcı arayüzü 3 alana ihtiyaç duyarken 40 alan döndürür. - Yetersiz veri çekme: bir kullanıcının gönderilerini ve her gönderinin yorum sayısını oluşturmak için önce
/users/1, sonra/users/1/posts, ardından N yorum uç noktasını çağırırsınız.
GraphQL bunu tek bir bildirimsel istekte birleştirir.
query {
user(id: 1) {
name
posts {
title
commentCount
}
}
}Tek Uç Nokta, Tür Denetimli Şema
REST birçok URL sunar; GraphQL ise güçlü tür denetimli bir şemayla desteklenen tek bir uç nokta sunar (genellikle POST /graphql). Şema sözleşmedir; kendini incelemeye açıktır, bu nedenle araçlar (otomatik tamamlama, belgeler, kod üretimi) hazır olarak gelir.
Aşağıda SDL ile yazılmış en küçük şema yer alıyor. Olası her yanıtın biçimi önceden bilinir.
type User {
id: ID!
name: String!
posts: [Post!]!
}
type Post {
id: ID!
title: String!
commentCount: Int!
}
type Query {
user(id: ID!): User
}Yanıt Sorguyu Yansıtır
Temel bir özellik şudur: JSON yanıtının biçimi sorgudan öngörülebilir. İstemciler alan adlarını hiçbir zaman tahmin etmek zorunda kalmaz. Bu, sürüm değişikliklerinden kaynaklanan büyük bir karmaşayı ortadan kaldırır; eski istemcileri bozmadan alan ekleyebilir ve @deprecated ile alanları kullanım dışı bırakabilirsiniz, bunun için /v2 URL'leri oluşturmanız gerekmez.
{
"data": {
"user": {
"name": "Ada",
"posts": [
{ "title": "On Engines", "commentCount": 12 }
]
}
}
}GraphQL REST'ten Nerede Üstündür
Şu durumlarda GraphQL daha güçlü bir tercihtir:
- Farklı veri ihtiyaçlarına sahip birçok farklı istemciye (web, iOS, Android) hizmet veriyorsanız.
- Veriler, istemcilerin dinamik olarak dolaştığı derin ilişkilere sahip bir grafik oluşturuyorsa.
- Birden çok arka ucu tek bir tür denetimli ağ geçidinin arkasında birleştirmek istiyorsanız.
- Ön ucun hızlı yinelenmesi önemliyse ve sonsuz arka uç uç noktası değişikliklerinden kaçınmak istiyorsanız.
REST'in Hâlâ Öne Çıktığı Durumlar
GraphQL'e düşünmeden yönelmeyiniz. REST şu durumlarda daha basit ve çoğu zaman daha iyidir:
- HTTP önbelleklemesine ihtiyacınız varsa — CDN/uç önbellekleri URL'lere ve fiillere göre anahtar oluşturur; tek bir
POST /graphqlonlar için opaktır. - API kaynak odaklı ve kararlıysa (birkaç varlık üzerinde oluşturma, okuma, güncelleme ve silme işlemleri).
- Dosya yükleme/indirme veya çok parçalı yapıların ve bayt aralıklarının REST'te birinci sınıf özellik olduğu akışlara güveniyorsanız.
- Geleneksel REST anlam kurallarını bekleyen üçüncü taraf tüketicileriniz varsa.
Kısa Bir PHP Karşılaştırması
Aynı veriler PHP'de REST yaklaşımıyla bir araya getirilmiştir — istemcinin yine birden fazla çağrı yapması veya bir gömme parametresini elle hazırlaması gerektiğine dikkat ediniz. GraphQL ise bu seçim mantığını istemciye taşır.
<?php
// REST: server decides the payload shape
function userResource(int $id): array {
return [
'id' => $id,
'name' => 'Ada',
'email' => 'ada@example.com', // over-fetched by mobile
'createdAt' => '1815-12-10',
'posts' => [ // pre-embedded, all-or-nothing
['title' => 'On Engines', 'commentCount' => 12],
],
];
}
header('Content-Type: application/json');
echo json_encode(userResource(1), JSON_PRETTY_PRINT);
GraphQL'in Getirdiği Maliyetler
GraphQL karmaşıklığı sunucuya taşır. Artık sizin yönetmeniz gereken yeni konular şunlardır:
- N+1 sorguları — toplu işlem yapmadığınız sürece iç içe çözücüler düğüm başına bir veritabanı sorgusu çalıştırır (DataLoader).
- Sorgu maliyeti / derinlik sınırlaması — kötü niyetli, derin biçimde iç içe bir sorgu hizmet engelleme saldırısıyla sisteminizi devre dışı bırakabilir.
- Önbellekleme daha zordur; genellikle HTTP katmanında değil, çözücü/veri katmanında önbelleğe alırsınız.
- Hata işleme farklıdır —
200 OKyanıtı yine de birerrorsdizisi taşıyabilir.
Hatalar: Hata Dizisi İçeren 200 Yanıtı
REST durum kodlarının aksine GraphQL, geleneksel olarak HTTP 200 döndürür ve kısmi hataları gövdenin içinde bildirir. data kısmen doldurulabilir; errors ise başarısız olan işlemleri listeler. İstemcileriniz her ikisini de incelemelidir.
{
"data": { "user": null },
"errors": [
{
"message": "User not found",
"path": ["user"],
"extensions": { "code": "NOT_FOUND" }
}
]
}Karar Ölçütü
Uygulamaya dönük pratik bir kural:
- Herkese açık, yoğun önbellekleme kullanan, kaynak tabanlı oluşturma-okuma-güncelleme-silme işlemleri → REST.
- Bağlantılı veriler üzerinden çeşitli ve gelişmiş istemcilere veri sağlayan dahili/ürün API'leri → GraphQL.
- Birçok arka ucu tek bir tür belirtilmiş sözleşmenin arkasında birleştirmek → GraphQL ağ geçidi.
Her ikisini birlikte çalıştırmak yaygın ve sağlıklıdır: web kancaları ve dosya yüklemeleri için REST, uygulamanın okuma grafiği için GraphQL.
PHP'de HTTP Üzerinden GraphQL Sunma
İşletim açısından, PHP'deki bir GraphQL uç noktası JSON gövdesini okuyan, query ve variables değerlerini çıkaran, bunları şemaya karşı çalıştıran ve { data, errors } döndüren tek bir rotadır. REST'in birçok rotasıyla karşılaştırıldığında aktarım tek tiptir — tüm değişkenlik istemcinin gönderdiği sorgu dizesinde bulunur.
<?php
// Minimal GraphQL-over-HTTP entry point
$input = json_decode(file_get_contents('php://input'), true) ?? [];
$query = $input['query'] ?? '';
$variables = $input['variables'] ?? null;
// $result = GraphQL::executeQuery($schema, $query, null, $ctx, $variables);
// header('Content-Type: application/json');
// echo json_encode($result->toArray());
var_dump(['query' => $query, 'variables' => $variables]);
Hızlı Kontrol
REST, GraphQL'e kıyasla ne zaman belirgin bir üstünlüğünü korur?
Özet
GraphQL ile REST'i temel özellikleri açısından karşılaştırdınız:
- GraphQL, tek bir tür bilgili uç nokta ve istemci yönlendirmeli seçimle gereğinden fazla veya az veri getirme sorunlarını çözer.
- Çok sayıda istemci, grafik biçimli veri ve arka uçların birleştirilmesi söz konusu olduğunda öne çıkar.
- REST; önbelleklenebilir herkese açık API'lerde, basit oluşturma-okuma-güncelleme-silme işlemlerinde, dosya yüklemelerinde ve geleneksel tüketicilerde güçlü kalır.
- GraphQL maliyeti sunucuya taşır: N+1, sorgu maliyeti sınırları, önbellekleme ve hata içeren 200 yanıtı kuralları.
Sıradaki konu: webonyx/graphql-php ile gerçekten bir şema oluşturmak.
Sıkça Sorulan Sorular
“GraphQL ve REST Karşılaştırması” dersi ücretsiz mi?
Evet — “GraphQL ve REST Karşılaştırması” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.
“GraphQL ve REST Karşılaştırması” dersinde ne öğreneceğim?
GraphQL'in ne zaman REST'ten daha iyi olduğunu ve nedenini anlayın. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
PHP Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“GraphQL ve REST Karşılaştırması” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- GraphQL ve REST Karşılaştırması
- graphql-php ile Şema Oluşturma
- Çözücüler, Mutasyonlar ve Abonelikler
- Performans: N+1 ve DataLoader