TL;DR
Herkese açık API'lar ve basit CRUD işlemleri için REST kullanın. İstemciler esnek veri alımı istediğinde ve aşırı veri alımını azaltmak istediğinizde GraphQL kullanın. Yüksek performanslı mikrohizmetler iletişimi için gRPC kullanın. Modern PetstoreAPI, her kullanım durumu için doğru aracı seçmenize olanak tanıyan bu üç protokolü de uygulamaktadır.
Giriş
Bir API oluşturuyorsunuz. REST, GraphQL veya gRPC mi kullanmalısınız? Her protokolün kendisinin en iyisi olduğunu iddia eden tutkulu savunucuları var. Gerçek şu ki: hepsi farklı şeyler için iyidir.
REST evrensel ve basittir. GraphQL istemcilere veri alımı üzerinde kontrol sağlar. gRPC dahili hizmetler için hızlı ve verimlidir. En iyi seçim, hangi protokolün “daha iyi” olduğuna değil, kullanım durumunuza bağlıdır.
Çoğu API tek bir protokol seçer ve ona bağlı kalır. Modern PetstoreAPI farklı bir yaklaşım benimser: REST, GraphQL ve gRPC'yi uygular ve aynı evcil hayvan mağazası API'sinin bu üç protokolde nasıl çalıştığını gösterir.
Bu kılavuzda, her protokolün güçlü ve zayıf yönlerini öğrenecek, Modern PetstoreAPI'den gerçek örnekler görecek ve ihtiyaçlarınız için doğru protokolü nasıl seçeceğinizi keşfedeceksiniz.
REST: Evrensel Standart
REST (Temsili Durum Transferi) en yaygın API protokolüdür.
REST Nasıl Çalışır
Kaynaklara HTTP metodları ile URL'ler aracılığıyla erişilir:
GET /pets - List pets
POST /pets - Create pet
GET /pets/{id} - Get pet
PUT /pets/{id} - Update pet
DELETE /pets/{id} - Delete pet
Örnek istek:
GET https://petstoreapi.com/v1/pets/019b4132-70aa-764f-b315-e2803d882a24
Örnek yanıt:
{
"id": "019b4132-70aa-764f-b315-e2803d882a24",
"name": "Fluffy",
"species": "CAT",
"status": "AVAILABLE",
"price": 299.99
}
REST'in Güçlü Yönleri
1. Evrensel uyumluluk
Her programlama dilinin HTTP kütüphaneleri vardır. Tarayıcılar, curl, Postman — hepsi REST ile çalışır.
2. Anlaması basit
URL'ler kaynakları temsil eder. HTTP metodları eylemleri temsil eder. Zihinsel model basittir.
3. Önbelleklenebilir
HTTP önbellekleme kutudan çıktığı gibi çalışır. GET istekleri tarayıcılar, CDN'ler ve proxy'ler tarafından önbelleğe alınabilir.
4. Durumsuz
Her istek bağımsızdır. Sunucuda oturum durumu yoktur.
5. Harika araçlar
OpenAPI belirtimleri, Swagger UI, API test araçları — REST en iyi ekosisteme sahiptir.
REST'in Zayıf Yönleri
1. Aşırı veri çekme (Over-fetching)
Sadece bir tanesine ihtiyacınız olsa bile tüm alanları alırsınız:
// Sadece isme ihtiyacınız var, ancak her şeyi alırsınız
{
"id": "019b4132-70aa-764f-b315-e2803d882a24",
"name": "Fluffy",
"species": "CAT",
"status": "AVAILABLE",
"price": 299.99,
"description": "...",
"images": [...],
"vaccinations": [...]
}
2. Yetersiz veri çekme (Under-fetching) (N+1 problemi)
Bir evcil hayvanı ve siparişlerini almak için birden fazla isteğe ihtiyacınız var:
GET /pets/123 # Evcil hayvanı al
GET /pets/123/orders # Siparişleri al
GET /orders/456/items # Sipariş öğelerini al
3. Sürümleme karmaşıklığı
Kırıcı değişiklikler yeni API sürümleri (/v1, /v2) gerektirir.
4. Gerçek zamanlı güncelleme yok
REST istek-yanıt tabanlıdır. Gerçek zamanlı veriler için polling veya WebSockets'a ihtiyacınız vardır.
REST Ne Zaman Kullanılır
- Herkese açık API'lar (maksimum uyumluluk)
- Basit CRUD işlemleri
- Önbelleklemenin önemli olduğu durumlarda
- Geniş araç desteğine ihtiyaç duyduğunuzda
- Tahmin edilebilir veri ihtiyaçları olan mobil uygulamalar
Modern PetstoreAPI REST uygulaması
GraphQL: Esnek Veri Alımı
GraphQL, istemcilerin tam olarak hangi verilere ihtiyaç duyduğunu belirtmesine olanak tanır.
GraphQL Nasıl Çalışır
Tek bir sorgu diliyle tek uç nokta:
query {
pet(id: "019b4132-70aa-764f-b315-e2803d882a24") {
name
species
orders {
id
total
items {
product
quantity
}
}
}
}
Yanıt:
{
"data": {
"pet": {
"name": "Fluffy",
"species": "CAT",
"orders": [
{
"id": "order-123",
"total": 49.99,
"items": [
{"product": "Cat food", "quantity": 2}
]
}
]
}
}
}
GraphQL'in Güçlü Yönleri
1. Aşırı veri çekme yok
İstemciler sadece ihtiyaç duydukları alanları ister:
query {
pet(id: "019b4132-70aa-764f-b315-e2803d882a24") {
name # Sadece ismi al
}
}
2. Yetersiz veri çekme yok
İlgili verileri tek bir istekte alın:
query {
pet(id: "019b4132-70aa-764f-b315-e2803d882a24") {
name
orders {
items {
product
}
}
}
}
N+1 problemi yok.
3. Güçlü tipleme
GraphQL şemaları güçlü bir şekilde tiplenmiştir. İstemciler neyin mevcut olduğunu tam olarak bilir.
4. İç gözlem (Introspection)
İstemciler, mevcut işlemleri keşfetmek için şemayı sorgulayabilir:
query {
__schema {
types {
name
fields {
name
type
}
}
}
}
5. Tek uç nokta
Tüm işlemler tek bir URL üzerinden gerçekleşir: /graphql
GraphQL'in Zayıf Yönleri
1. Karmaşıklık
GraphQL'i öğrenmek REST'ten daha zordur. Sorgular, mutasyonlar, abonelikler, çözücüler — anlaşılması gereken daha fazla şey var.
2. Önbellekleme daha zor
HTTP önbellekleme iyi çalışmaz. Özel önbellekleme stratejilerine ihtiyacınız vardır.
3. Aşırı sorgulama riski
İstemciler pahalı sorgular yazabilir:
query {
pets {
orders {
items {
product {
reviews {
author {
pets {
# Sonsuz derinlik!
}
}
}
}
}
}
}
}
Sorgu derinlik limitlerine ve karmaşıklık analizine ihtiyacınız vardır.
4. Dosya yüklemeleri sorunlu
GraphQL dosya yüklemeleri için tasarlanmamıştır. Geçici çözümlere ihtiyacınız vardır.
5. İzleme daha zor
Tüm istekler /graphql'e gider. URL ile izleme yapamazsınız.
GraphQL Ne Zaman Kullanılır
- Mobil uygulamalar (bant genişliğini azaltır)
- Karmaşık veri gereksinimleri
- İstemciler esneklik istediğinde
- Bilinen istemcileri olan dahili API'lar
- Sürümlemeden kaçınmak istediğinizde
Modern PetstoreAPI GraphQL uygulaması
gRPC: Yüksek Performanslı RPC
gRPC, verimli ikili iletişim için Protocol Buffers kullanır.
gRPC Nasıl Çalışır
Hizmetleri .proto dosyalarında tanımlayın:
service PetService {
rpc GetPet(GetPetRequest) returns (Pet);
rpc ListPets(ListPetsRequest) returns (ListPetsResponse);
rpc CreatePet(CreatePetRequest) returns (Pet);
}
message Pet {
string id = 1;
string name = 2;
string species = 3;
PetStatus status = 4;
}
İstemci kodu (oluşturulmuş):
client := pb.NewPetServiceClient(conn)
pet, err := client.GetPet(ctx, &pb.GetPetRequest{
Id: "019b4132-70aa-764f-b315-e2803d882a24",
})
gRPC'nin Güçlü Yönleri
1. Performans
Protocol Buffers, JSON'dan daha küçük ve daha hızlıdır:
- 3-10 kat daha küçük yükler
- 20-100 kat daha hızlı serileştirme
2. Akış (Streaming)
Sunucu akışı, istemci akışı ve çift yönlü akış için yerleşik destek:
rpc WatchPets(WatchPetsRequest) returns (stream Pet);
3. Güçlü tipleme
Protocol Buffers derleme zamanında tipleri zorunlu kılar.
4. Kod oluşturma
.proto dosyalarından 10'dan fazla dilde istemci ve sunucu kodu oluşturun.
5. HTTP/2
Çoklama, başlık sıkıştırma ve sunucu gönderme (server push).
gRPC'nin Zayıf Yönleri
1. Tarayıcı dostu değil
Tarayıcılar HTTP/2 çift yönlü akışı desteklemez. grpc-web'e ihtiyacınız var (geçici bir çözüm).
2. İnsan tarafından okunabilir değil
Protocol Buffers ikilidir. Bir gRPC uç noktasını curl ile çağırıp yanıtı okuyamazsınız.
3. Hata ayıklaması daha zor
İkili protokolleri incelemek JSON'dan daha zordur.
4. Daha az araç desteği
REST'e göre daha az araç. Swagger UI'ye eşdeğer bir şey yok.
5. Daha dik öğrenme eğrisi
Protocol Buffers, kod oluşturma ve gRPC kavramlarını öğrenmek zaman alır.
gRPC Ne Zaman Kullanılır
- Mikrohizmetler arası iletişim
- Yüksek performans gereksinimleri
- Gerçek zamanlı akış
- Dahili API'lar (Herkese açık olmayan)
- Çok dilli ortamlar (birden çok dil)
Modern PetstoreAPI gRPC uygulaması
Yan Yana Karşılaştırma
| Özellik | REST | GraphQL | gRPC |
|---|---|---|---|
| Protokol | HTTP/1.1 veya HTTP/2 | HTTP/1.1 veya HTTP/2 | Sadece HTTP/2 |
| Veri Biçimi | JSON (genellikle) | JSON | Protocol Buffers (ikili) |
| Uç Noktalar | Çoklu (/pets, /orders) |
Tek (/graphql) |
Servis metodları |
| Aşırı veri çekme | Yaygın | Nadir | Yok (mesajları siz tanımlarsınız) |
| Yetersiz veri çekme | Yaygın (N+1) | Nadir | Yok |
| Önbellekleme | Mükemmel (HTTP) | Zayıf | Zayıf |
| Tarayıcı Desteği | Mükemmel | Mükemmel | Zayıf (grpc-web gerektirir) |
| Araç Desteği | Mükemmel | İyi | Orta |
| Öğrenme Eğrisi | Kolay | Orta | Zor |
| Performans | İyi | İyi | Mükemmel |
| Akış | Hayır (WebSocket gerekir) | Evet (abonelikler) | Evet (yerel) |
| Sürümleme | URL veya başlık | Şema evrimi | Proto evrimi |
| En İyisi | Herkese açık API'lar, CRUD | Esnek istemciler | Mikrohizmetler |
Modern PetstoreAPI Üç Protokolü Nasıl Uygular
Modern PetstoreAPI benzersizdir: aynı evcil hayvan mağazası API'sini REST, GraphQL ve gRPC'de uygular.
Aynı Veri, Üç Protokol
Bir evcil hayvanı ID ile al:
REST:
GET https://petstoreapi.com/v1/pets/019b4132-70aa-764f-b315-e2803d882a24
GraphQL:
query {
pet(id: "019b4132-70aa-764f-b315-e2803d882a24") {
id
name
species
}
}
gRPC:
pet, err := client.GetPet(ctx, &pb.GetPetRequest{
Id: "019b4132-70aa-764f-b315-e2803d882a24",
})
Her üçü de aynı evcil hayvan verilerini döndürür.
Neden Üçünü de Uygulamalı?
1. Karşılaştırma yaparak öğrenin
Aynı işlemlerin farklı protokollerde nasıl çalıştığını görün.
2. Doğru aracı seçin
Herkese açık uç noktalar için REST, mobil uygulamalar için GraphQL, dahili hizmetler için gRPC kullanın.
3. Geçiş yolu
REST ile başlayın, her şeyi yeniden yazmadan daha sonra GraphQL veya gRPC ekleyin.
4. Referans uygulama
Modern PetstoreAPI, her üç protokol için de üretime hazır modelleri gösterir.
Detaylı örnekler için protokol karşılaştırma kılavuzuna bakın.
Apidog ile Çok Protokollü API'ları Test Etme
Apidog, REST, GraphQL ve gRPC'yi tek bir araçta destekler.
REST Test Etme
OpenAPI belirtimini içe aktarın ve otomatik testleri çalıştırın:
pm.test("Durum 200", () => {
pm.response.to.have.status(200);
});
pm.test("Evcil hayvan gerekli alanlara sahip", () => {
const pet = pm.response.json();
pm.expect(pet).to.have.property('id');
pm.expect(pet).to.have.property('name');
});
GraphQL Test Etme
GraphQL sorguları yazın ve yanıtları doğrulayın:
query GetPet($id: ID!) {
pet(id: $id) {
id
name
species
}
}
Apidog, GraphQL şemasına göre doğrular.
gRPC Test Etme
.proto dosyalarını içe aktarın ve gRPC hizmetlerini test edin:
service: PetService
method: GetPet
request: { "id": "019b4132-70aa-764f-b315-e2803d882a24" }
Apidog, Protocol Buffer tanımlarından istekler oluşturur.
Çapraz Protokol Testi
Her üç protokolün de tutarlı veri döndürdüğünü test edin:
- REST uç noktasını çağırın
- GraphQL sorgusunu çağırın
- gRPC metodunu çağırın
- Yanıtları karşılaştırın
Apidog, çok protokollü API'nızın tutarlı kalmasına yardımcı olur.
Doğru Protokolü Seçme
Bu karar ağacını kullanın:
Bu herkese açık bir API mi?→ Evet: REST kullanın (maksimum uyumluluk) → Hayır: Devam edin
Gerçek zamanlı akışa mı ihtiyacınız var?→ Evet: gRPC veya WebSocket kullanın → Hayır: Devam edin
İstemciler esnek veri alımına mı ihtiyaç duyuyor?→ Evet: GraphQL kullanın → Hayır: Devam edin
Performans kritik mi (mikrohizmetler)?→ Evet: gRPC kullanın → Hayır: REST kullanın (en basit seçenek)
Gerçek Dünya Örnekleri
- Stripe: REST (Herkese açık API, basit, önbelleklenebilir)
- GitHub: REST + GraphQL (Herkese açık için REST, karmaşık sorgular için GraphQL)
- Google Cloud: gRPC + REST (Performans için gRPC, uyumluluk için REST)
- Netflix: GraphQL (mobil uygulamaların esnek verilere ihtiyacı var)
- Uber: gRPC (mikrohizmetler arası iletişim)
Birden Fazla Protokol Kullanabilir misiniz?
Evet! Modern PetstoreAPI nasıl yapıldığını gösteriyor. Yaygın modeller:
- Herkese açık API için REST
- Mobil uygulamalar için GraphQL
- Dahili mikrohizmetler için gRPC
Her protokol farklı ihtiyaçları olan farklı istemcilere hizmet eder.
Sonuç
REST, GraphQL ve gRPC rakipler değildir — farklı işler için araçlardır. REST evrensel ve basittir. GraphQL istemcilere kontrol sağlar. gRPC hızlı ve verimlidir.
Modern PetstoreAPI, aynı API'nin protokoller arasında nasıl çalıştığını göstererek bu üçünü de uygular. Üretime hazır örnekleri görmek için REST belgelerini, GraphQL şemasını ve gRPC proto dosyalarını inceleyebilirsiniz.
Üç protokolü de test etmek, uygulamaları karşılaştırmak ve çok protokollü API'nızda tutarlılık sağlamak için Apidog'u kullanın.
En iyi protokol, özel sorununuzu çözen protokoldür. Modern PetstoreAPI size akıllıca seçim yapma bilgisi verir.
Sıkça Sorulan Sorular
REST ve GraphQL'i birlikte kullanabilir miyim?
Evet. Birçok API her ikisini de sunar. Basit işlemler için REST'i, karmaşık sorgular için GraphQL'i kullanın. GitHub bunu yapar.
gRPC REST'in yerini mi alıyor?
Hayır. gRPC dahili mikrohizmetler içindir. REST, daha iyi uyumluluk ve araç desteği nedeniyle herkese açık API'lar için standart olmaya devam ediyor.
Hangi protokol en hızlıdır?
gRPC, Protocol Buffers ve HTTP/2 sayesinde en hızlısıdır. Ancak çoğu API için fark önemli değildir — ağ gecikmesi baskındır.
REST'ten GraphQL'e geçmeli miyim?
Sadece aşırı veri çekme/yetersiz veri çekme sorununuz varsa. Sadece GraphQL popüler diye geçiş yapmayın.
Tarayıcılar gRPC kullanabilir mi?
Doğrudan değil. Karmaşıklık ekleyen grpc-web'e ihtiyacınız var. Tarayıcı istemcileri için REST veya GraphQL kullanın.
Modern PetstoreAPI üç protokolü nasıl senkronize tutar?
Paylaşılan iş mantığı katmanı. REST, GraphQL ve gRPC aynı temel API üzerinde ince protokol adaptörleridir.
Startuplar hangi protokolü kullanmalı?
REST ile başlayın. Basit, iyi anlaşılmış ve harika araçlara sahiptir. İhtiyaç duyarsanız GraphQL veya gRPC'yi daha sonra ekleyin.
Apidog üç protokolü de destekliyor mu?
Evet. Apidog, REST (OpenAPI), GraphQL ve gRPC'yi tek bir araçta destekleyerek Modern PetstoreAPI gibi çok protokollü API'ları test etmeyi kolaylaştırır.
