GraphQL, istemciler ve sunucular arasında verimli iletişimi kolaylaştırmak için tasarlanmış bir API sorgu dilidir. Kullanıcının yanıtta tam olarak hangi veriyi istediğini belirtmesini sağlar, böylece REST API'lerde görülen büyük yanıt nesneleri ve çoklu çağrıları önlemeye yardımcı olur.
GraphQL servisleri, bir istemcinin sunucu ile iletişim kurabileceği bir sözleşme tanımlar. İstemcinin verinin nerede bulunduğunu bilmesi gerekmez. Platform bağımsız olan GraphQL, çok çeşitli programlama dilleriyle implementasyonu yapılabilir ve hemen hemen her veri deposuyla iletişim kurmak için kullanılabilir.
GraphQL: Tek endpoint, POST istekleri, esnek veri alma
GraphQL Nasıl Çalışır?
GraphQL şemaları, servisin veri yapısını tanımlar ve mevcut nesneleri (tipler), alanları ve ilişkileri listeler. Tüm GraphQL operasyonları aynı endpoint'i kullanır ve genellikle POST isteği olarak gönderilir.
# Basit şema tanımı örneği type Product { id: ID! name: String! description: String! price: Int listed: Boolean } type Query { getProduct(id: ID!): Product getProducts: [Product] } type Mutation { createProduct(name: String!, description: String!): Product updateProduct(id: ID!, name: String): Product }
GraphQL Operasyon Türleri
# Örnek sorgu query myGetProductQuery { getProduct(id: 123) { id name description price } } # Yanıt { "data": { "getProduct": { "id": 123, "name": "Sample Product", "description": "Product description", "price": 99 } } }
# Örnek mutasyon mutation { createProduct(name: "Yeni Ürün", description: "Açıklama") { id name listed } } # Mutasyon yanıtı { "data": { "createProduct": { "id": 124, "name": "Yeni Ürün", "listed": true } } }
GraphQL Bileşenleri
Arguments (Argümanlar): Belirli alanlar için sağlanan değerler.
Variables (Değişkenler): Dinamik argümanları geçirmek için kullanılır.
Aliases (Takma Adlar): Aynı türden birden fazla nesne döndürmeyi sağlar.
Fragments (Parçalar): Sorguların yeniden kullanılabilir bölümleri.
# Değişken kullanımı query getEmployeeWithVariable($id: ID!) { getEmployees(id: $id) { name { firstname lastname } } } # Değişkenler { "id": 1 }
# Alias kullanımı query getProductDetails { product1: getProduct(id: "1") { id name } product2: getProduct(id: "2") { id name } }
# Fragment tanımı fragment productInfo on Product { id name listed price } # Fragment kullanımı query { getProduct(id: 1) { ...productInfo stock } }
Subscriptions (Abonelikler)
Subscriptions özel bir sorgu türüdür. İstemcilerin sunucu ile uzun süreli bir bağlantı kurmasını sağlar, böylece sunucu sürekli olarak veri için polling yapmaya gerek kalmadan gerçek zamanlı güncellemeleri istemciye gönderebilir. Chat sistemleri veya işbirliği tabanlı editörler gibi küçük gerçek zamanlı güncellemeler gerektiren işlevsellik için kullanışlıdır.
# Subscription örneği subscription { messageAdded(roomId: "chat-room-1") { id content user { name } timestamp } } # WebSocket üzerinden gerçek zamanlı yanıt { "data": { "messageAdded": { "id": "msg-123", "content": "Yeni mesaj!", "user": { "name": "Kullanıcı" }, "timestamp": "2025-01-01T10:30:00Z" } } }
Introspection Sistemi
Introspection, GraphQL'in yerleşik bir özelliğidir ve şema hakkında bilgi sorgulamanızı sağlar. GraphQL IDE'leri ve dokümantasyon üretimi araçları tarafından yaygın olarak kullanılır.
# Temel introspection sorgusu { __schema { queryType { name } mutationType { name } subscriptionType { name } types { name kind description } } } # Tüm field'ları listele { __schema { types { name fields { name type { name } description } } } }
GraphQL Güvenlik Açıkları
GraphQL güvenlik açıkları genellikle implementasyon ve tasarım hatalarından kaynaklanır. Örneğin, introspection özelliği aktif bırakılabilir veya uygun CSRF koruması olmayabilir.
GraphQL Güvenlik Açığı Değerlendirmesi
- • Tek endpoint üzerinden tüm işlemler
- • Esnek sorgu yapısı
- • Type system (tip sistemi)
- • Introspection desteği
- • Real-time subscription'lar