RESTful API, GraphQL, gRPC API geliştirme ve entegrasyon teknolojilerileri
1. RESTful API (Representational State Transfer)
REST, bir yazılım mimari stilidir ve web servisleri oluşturmak için yaygın olarak kullanılır. RESTful API’ler, istemcilerin sunucu kaynaklarına erişmesini ve bu kaynakları manipüle etmesini sağlar.
Temel Prensipleri:
- İstemci-Sunucu (Client-Server): İstemci ve sunucu birbirinden bağımsızdır. İstemci, sunucudaki verilere erişir ve sunucu istemcinin davranışını etkilemez.
- Durumsuz (Stateless): Her istek, istemcinin sunucuya gerekli tüm bilgileri sağlamasını gerektirir. Sunucu, istemci oturumunu veya durumunu saklamaz.
- Önbelleklenebilir (Cacheable): Sunucu yanıtları önbelleklenebilir olarak işaretlenebilir, bu da istemcilerin aynı isteği tekrar tekrar göndermesini önler.
- Katmanlı Sistem (Layered System): İstemci, sunucuya doğrudan bağlı olduğunu düşünür, ancak aslında araya farklı katmanlar (proxy, load balancer vb.) girebilir.
- Tek Tip Arayüz (Uniform Interface): API’nin tutarlı ve tahmin edilebilir olmasını sağlar.
- Kaynak Tanımlama (Resource Identification): Her kaynak benzersiz bir URI ile tanımlanır.
- Kaynak Manipülasyonu (Resource Manipulation): Kaynaklar, HTTP metodları (GET, POST, PUT, DELETE) kullanılarak manipüle edilir.
- Kendi Kendini Tanımlayan Mesajlar (Self-Descriptive Messages): Her mesaj, içeriği hakkında yeterli bilgi içermelidir (Content-Type).
- Köprüler Olarak Uygulama Durumu (Hypermedia as the Engine of Application State – HATEOAS): API yanıtları, istemcinin sonraki adımları gerçekleştirmesi için köprüler (linkler) içermelidir.
HTTP Metotları:
- GET: Bir kaynağı almak için kullanılır.
- POST: Yeni bir kaynak oluşturmak için kullanılır.
- PUT: Mevcut bir kaynağı güncellemek için kullanılır (tüm kaynağı değiştirir).
- PATCH: Mevcut bir kaynağı kısmen güncellemek için kullanılır.
- DELETE: Bir kaynağı silmek için kullanılır.
Veri Formatları:
- JSON (JavaScript Object Notation): En yaygın kullanılan format.
- XML (Extensible Markup Language)
Avantajları:
- Basitlik: Anlaşılması ve uygulanması kolaydır.
- Yaygın Kullanım: Geniş bir araç ve kütüphane desteği vardır.
- Ölçeklenebilirlik: HTTP protokolü iyi ölçeklenebilir.
- Esneklik: Farklı veri formatlarını destekler.
Dezavantajları:
- Aşırı Veri Getirme (Over-Fetching): İstemci, ihtiyacı olandan daha fazla veri alabilir.
- Eksik Veri Getirme (Under-Fetching): İstemcinin birden fazla istek yapması gerekebilir.
- HATEOAS Karmaşıklığı: HATEOAS’ı uygulamak karmaşık olabilir.
Örnek Senaryo:
Bir kitaplık API’si:
- GET /books: Tüm kitapları listeler.
- GET /books/{id}: Belirli bir kitabı getirir.
- POST /books: Yeni bir kitap oluşturur.
- PUT /books/{id}: Belirli bir kitabı günceller.
- DELETE /books/{id}: Belirli bir kitabı siler.
2. GraphQL
GraphQL, API’ler için bir sorgu dili ve sunucu tarafı çalışma zamanıdır. İstemcilerin tam olarak ihtiyaç duydukları veriyi talep etmelerini sağlar. Facebook tarafından geliştirilmiştir.
Temel Kavramlar:
- Schema (Şema): API’nin veri türlerini ve ilişkilerini tanımlar.
- Query (Sorgu): İstemcinin sunucudan veri talep etmek için kullandığı dildir.
- Mutation (Değişim): Sunucuda veri oluşturmak, güncellemek veya silmek için kullanılır.
- Resolver (Çözücü): Her bir alan için veri nasıl alınacağını tanımlayan fonksiyonlardır.
Çalışma Prensibi:
- İstemci, GraphQL şemasını kullanarak bir sorgu oluşturur.
- Sorgu, GraphQL sunucusuna gönderilir.
- Sunucu, sorguyu ayrıştırır ve şemaya göre doğrular.
- Her bir alan için ilgili çözücüler çağrılır.
- Veri toplanır ve istemciye JSON formatında döndürülür.
Avantajları:
- Verimli Veri Getirme: İstemci, tam olarak ihtiyaç duyduğu veriyi talep eder, bu da aşırı ve eksik veri getirme sorunlarını çözer.
- Tek Uç Nokta (Single Endpoint): Genellikle tek bir API uç noktası kullanılır (örn: /graphql).
- Güçlü Tip Sistemi: Şema, veri türlerini ve ilişkilerini tanımlar, bu da geliştirme sırasında hataları yakalamayı kolaylaştırır.
- Otomatik Dokümantasyon: Şema, API’nin otomatik olarak dokümante edilmesini sağlar.
- Esneklik: İstemci tarafında daha fazla kontrol sağlar.
Dezavantajları:
- Öğrenme Eğrisi: REST’e kıyasla daha karmaşıktır.
- Karmaşık Sorgular: Çok karmaşık sorgular performans sorunlarına yol açabilir.
- Önbellekleme Zorluğu: REST’e göre önbellekleme daha zordur.
- Hata Ayıklama: Hata ayıklama REST’e göre daha zor olabilir.
Örnek Senaryo:
Bir blog API’si:
query {
post(id: "123") {
title
content
author {
name
email
}
}
}
content_copydownloadUse code with caution.Graphql
Bu sorgu, 123 ID’li gönderinin başlığını, içeriğini ve yazarının adını ve e-postasını talep eder.
3. gRPC (gRPC Remote Procedure Calls)
gRPC, Google tarafından geliştirilen yüksek performanslı, açık kaynaklı bir RPC (Remote Procedure Call) çerçevesidir. Özellikle mikroservis mimarilerinde servisler arası iletişim için tasarlanmıştır.
Temel Kavramlar:
- Protocol Buffers (Protobuf): gRPC, veri serileştirme için Protocol Buffers kullanır. Protobuf, yapılandırılmış verileri serileştirmek için kullanılan bir dildir.
- Service Definition (Servis Tanımı): Servisler ve metotları Protobuf dosyalarında tanımlanır.
- RPC (Remote Procedure Call): Uzak bir sunucuda bir fonksiyonu çağırmak için kullanılır.
- HTTP/2: gRPC, HTTP/2 protokolünü kullanır, bu da performans avantajları sağlar.
Çalışma Prensibi:
- Servis tanımı Protobuf dosyalarında yapılır.
- Protobuf derleyicisi, servis tanımından istemci ve sunucu tarafı kodlarını oluşturur.
- İstemci, sunucudaki bir metodu çağırmak için oluşturulan kodu kullanır.
- Veri, Protobuf formatında serileştirilir ve HTTP/2 üzerinden sunucuya gönderilir.
- Sunucu, veriyi alır, metodu çalıştırır ve sonucu Protobuf formatında serileştirerek istemciye geri gönderir.
Avantajları:
- Yüksek Performans: HTTP/2 ve Protobuf sayesinde çok hızlıdır.
- Güçlü Tip Sistemi: Protobuf, güçlü bir tip sistemi sağlar.
- Kod Üretimi: Protobuf derleyicisi, istemci ve sunucu tarafı kodlarını otomatik olarak oluşturur.
- Çoklu Dil Desteği: Birçok farklı programlama dilini destekler.
- Akış (Streaming): İstemci ve sunucu arasında akışlı iletişim desteği vardır.
Dezavantajları:
- Öğrenme Eğrisi: Protobuf ve gRPC’nin öğrenilmesi zaman alabilir.
- İnsan Tarafından Okunabilirlik: Protobuf formatı, JSON gibi insan tarafından kolayca okunamaz.
- Tarayıcı Desteği: Tarayıcılar gRPC’yi doğrudan desteklemez (gRPC-Web ile çözülebilir).
Örnek Senaryo:
Bir kullanıcı doğrulama servisi:
syntax = "proto3";
package auth;
service AuthService {
rpc ValidateUser (ValidateUserRequest) returns (ValidateUserResponse);
}
message ValidateUserRequest {
string username = 1;
string password = 2;
}
message ValidateUserResponse {
bool isValid = 1;
string userId = 2;
}
content_copydownloadUse code with caution.Protobuf
Bu tanım, ValidateUser adında bir metodu olan AuthService servisini tanımlar.
Karşılaştırma Tablosu:
Özellik | RESTful API | GraphQL | gRPC |
Mimari | REST | GraphQL | RPC |
Veri Formatı | JSON, XML | JSON | Protocol Buffers |
Protokol | HTTP | HTTP | HTTP/2 |
Verimlilik | Değişken (Aşırı/Eksik Veri Getirme) | Yüksek (Tam Olarak İstenen Veri) | Çok Yüksek |
Tip Sistemi | Zayıf (Genellikle) | Güçlü | Güçlü |
Kod Üretimi | Yok (Genellikle) | Yok (Genellikle) | Var (Protobuf Derleyicisi) |
İnsan Okunabilirliği | Yüksek | Yüksek | Düşük (Protobuf) |
Dil Desteği | Geniş | Geniş | Geniş |
Kullanım Alanları | Web API’leri, mobil uygulamalar | Kompleks UI’ler, API birleştirme | Mikroservisler, yüksek performanslı API’ler |
Hangi Teknolojiyi Seçmeliyim?
- RESTful API: Basit, genel amaçlı API’ler için iyi bir seçimdir.
- GraphQL: İstemci tarafında daha fazla kontrole ihtiyaç duyulan, karmaşık UI’ler için idealdir.
- gRPC: Yüksek performans gerektiren, servisler arası iletişim için en iyi seçenektir.