WEB / WEB-17.03
GraphQL execution model
Bir field hatası hangi response parçasını boşaltır; validation ile izin nerede ayrılır?
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Tam sonuç
- Read hazır
Client book-A için BookTitle query’sini ve id/title/subtitle selection’ını hazırladı. Schema server’a aittir; query/ID bir resource izni değildir ve executor henüz operation’ı almadı.
- GraphQL reader
- book-A; id/title/subtitle hazır
- Atlas executor
- Schema hazır; request yok
- Request geldi
Operation ve variables server’a ulaştı; parse, validation ve resolver execution hâlâ pending.
- GraphQL reader
- Book operation hazır
- Atlas executor
- Operation geldi; parse pending
- Local parse
Örnekte parse koşulu olumlu verilmiştir; server operation ledger’ından validation aşamasına geçer.
- GraphQL reader
- Book operation hazır
- Atlas executor
- Parse koşulu olumlu; validation bekliyor
- Validate/coerce
Bilinen fields ile ID input koşulu kabul edilir; object policy resolver context’inde ayrıca değerlendirilir.
- GraphQL reader
- Book operation hazır
- Atlas executor
- Validated/coerced; resolver bekliyor
- Local resolver
Örnekte policy izin verir; local book ve field sonuçları hazırlanır, completion boundary’si henüz seçilmemiştir.
- GraphQL reader
- Book operation hazır
- Atlas executor
- Field sonuçları hazır; completion bekliyor
- Typed completion
Field completion seçilen id/title/subtitle değerlerini tamamlar; data.book tam sonuç olarak hazırlanır.
- GraphQL reader
- Book operation hazır
- Atlas executor
- data.book tam; result hazır
- Result geldi
Client result body’yi teslim alır; data ve errors içeriği UI kararından önce ayrı değerlendirilir.
- GraphQL reader
- Result alındı; UI mapping pending
- Atlas executor
- data.book tam; result hazır
- Local UI kararı
Reader bu result’taki id/title/subtitle alanlarını yeni book UI verisi olarak kabul eder. Bu yerel mapping kararı browser DOM veya pixel ölçümü değildir; result body gelmeden verilmez.
- GraphQL reader
- title/subtitle gösterildi
- Atlas executor
- data.book tam; result hazır
Validation reddi
- Read hazır
Client book-A için BookTitle query’sini ve id/title/caption selection’ını hazırladı. Schema server’a aittir; query/ID bir resource izni değildir ve executor henüz operation’ı almadı.
- GraphQL reader
- book-A; id/title/caption hazır
- Atlas executor
- Schema hazır; request yok
- Request geldi
Operation ve variables server’a ulaştı; parse, validation ve resolver execution hâlâ pending.
- GraphQL reader
- Book operation hazır
- Atlas executor
- Operation geldi; parse pending
- Local parse
Örnekte parse koşulu olumlu verilmiştir; server operation ledger’ından validation aşamasına geçer.
- GraphQL reader
- Book operation hazır
- Atlas executor
- Parse koşulu olumlu; validation bekliyor
- Validation sınırı
Seçilen caption field’i schema’da bulunmaz; execution başlamadan data alanı olmayan error result hazırlanır.
- GraphQL reader
- Book operation hazır
- Atlas executor
- Validation denied; calls=0; errors hazır
- Request error geldi
Client execution öncesi error result’u teslim aldı; data absent durumu data:null değildir.
- GraphQL reader
- errors geldi; data absent
- Atlas executor
- Validation denied; calls=0; errors hazır
Nullable hata
- Read hazır
Client book-A için BookTitle query’sini ve id/title/subtitle selection’ını hazırladı. Schema server’a aittir; query/ID bir resource izni değildir ve executor henüz operation’ı almadı.
- GraphQL reader
- book-A; id/title/subtitle hazır
- Atlas executor
- Schema hazır; request yok
- Request geldi
Operation ve variables server’a ulaştı; parse, validation ve resolver execution hâlâ pending.
- GraphQL reader
- Book operation hazır
- Atlas executor
- Operation geldi; parse pending
- Local parse
Örnekte parse koşulu olumlu verilmiştir; server operation ledger’ından validation aşamasına geçer.
- GraphQL reader
- Book operation hazır
- Atlas executor
- Parse koşulu olumlu; validation bekliyor
- Validate/coerce
Bilinen fields ile ID input koşulu kabul edilir; object policy resolver context’inde ayrıca değerlendirilir.
- GraphQL reader
- Book operation hazır
- Atlas executor
- Validated/coerced; resolver bekliyor
- Local resolver
Örnekte policy izin verir; local book ve field sonuçları hazırlanır, completion boundary’si henüz seçilmemiştir.
- GraphQL reader
- Book operation hazır
- Atlas executor
- Field sonuçları hazır; completion bekliyor
- Typed completion
Nullable subtitle error’u subtitle:null olarak kalır; id/title korunur ve errors listesi aynı result’a eklenir.
- GraphQL reader
- Book operation hazır
- Atlas executor
- subtitle:null + errors; result hazır
- Result geldi
Client result body’yi teslim alır; data ve errors içeriği UI kararından önce ayrı değerlendirilir.
- GraphQL reader
- Result alındı; UI mapping pending
- Atlas executor
- subtitle:null + errors; result hazır
- Local UI kararı
Reader title=Atlas Notları bilgisini kullanılabilir tutar; subtitle:null için book/subtitle error path’ine bağlı hata durumu seçer. Data ve errors birlikte okunur; bu adım gerçek DOM render ölçmez.
- GraphQL reader
- title var; subtitle error state
- Atlas executor
- subtitle:null + errors; result hazır
Non-null yayılım
- Read hazır
Client book-A için BookTitle query’sini ve id/title/subtitle selection’ını hazırladı. Schema server’a aittir; query/ID bir resource izni değildir ve executor henüz operation’ı almadı.
- GraphQL reader
- book-A; id/title/subtitle hazır
- Atlas executor
- Schema hazır; request yok
- Request geldi
Operation ve variables server’a ulaştı; parse, validation ve resolver execution hâlâ pending.
- GraphQL reader
- Book operation hazır
- Atlas executor
- Operation geldi; parse pending
- Local parse
Örnekte parse koşulu olumlu verilmiştir; server operation ledger’ından validation aşamasına geçer.
- GraphQL reader
- Book operation hazır
- Atlas executor
- Parse koşulu olumlu; validation bekliyor
- Validate/coerce
Bilinen fields ile ID input koşulu kabul edilir; object policy resolver context’inde ayrıca değerlendirilir.
- GraphQL reader
- Book operation hazır
- Atlas executor
- Validated/coerced; resolver bekliyor
- Local resolver
Örnekte policy izin verir; local book ve field sonuçları hazırlanır, completion boundary’si henüz seçilmemiştir.
- GraphQL reader
- Book operation hazır
- Atlas executor
- Field sonuçları hazır; completion bekliyor
- Typed completion
Non-null title error’u nearest nullable ancestor olan Query.book’a yayılır; data.book:null ve errors hazırlanır.
- GraphQL reader
- Book operation hazır
- Atlas executor
- data.book:null + errors; result hazır
- Result geldi
Client result body’yi teslim alır; data ve errors içeriği UI kararından önce ayrı değerlendirilir.
- GraphQL reader
- Result alındı; UI mapping pending
- Atlas executor
- data.book:null + errors; result hazır
- Local UI kararı
Reader data.book:null nedeniyle yeni Book görünümünü unavailable olarak seçer. Error path book/title’dır; eski title yeni başarılı sonuç gibi kullanılmaz. Data object’i var, book null’dır; data alanı absent değildir.
- GraphQL reader
- book yok; eski title kullanılmaz
- Atlas executor
- data.book:null + errors; result hazır
ROLLER · STATE · VERİ AKIŞI
Selection set bir iş akışı değildir
GraphQL client’a typed schema içinden hangi response alanlarını istediğini söyleme yolu verir. Atlas örneği Query.book(id: ID!): Book ile id/title/subtitle seçer. Schema API’nin field ve type sözleşmesidir; database şemasıyla birebir eşleşmek zorunda değildir. Query read sonucunu, mutation üst seviye değişiklik işlemini, subscription ise source event’lere bağlı response stream’ini tarif eder. Bu derste yalnız ordinary read query yürütülür; subscription’ın transport’u veya mutation transaction’ı bu animasyonun kapsamı değildir.
Client document’i language grammar’a göre parse edilir; sonra field’ların schema’da bulunması, selection’ın tipe uygunluğu ve variable kullanımının anlamı validate edilir. id variable’ı seçilen operation’ın ID! input’una coerced edilir. Unknown caption field’i bu aşamada request error olur; book resolver çalıştırıp sonra yanlış alanı gizlemek aynı davranış değildir. Önceden doğrulanmış unchanged operation memoize edilebilir; validation’ın her request’te mutlaka yeniden parse edilen bir network adımı olduğunu varsaymayız.
Resolver sonucundan typed response’a
Resolver parent value, field arguments ve server’ın kurduğu context ile field sonucunu üretir. Atlas context’i declared session/tenant permission taşır ve book-A sabit local kayıttan okunur. Resolver çağrısı otomatik olarak HTTP request değildir; in-memory lookup için sahnede local işlem kullanılır. Field completion returned value’yu schema type’ına göre tamamlar: nested object’in seçili alanlarını yürütür veya scalar output coercion yapar. Runtime’daki her object alanını response’a kopyalamak selection set’i yürütmek değildir.
subtitle:String nullable iken resolver error olduğunda subtitle:null ve errors listesi birlikte üretilebilir; id/title başarıyla tamamlanır. title:String! hatasında title null olarak Book içinde bırakılamaz: hata nearest nullable ancestor olan Query.book’a yayılır ve data.book:null olur. Book da non-null seçilseydi yayılım daha yukarı giderdi; her ancestor non-null olduğunda data:null mümkündür. Error path, sonucu null’a yayılsa bile ilk problemli response position’ı anlatır; aliases kullanılıyorsa response isimleri esas alınır.
Execution sonucu ile HTTP sonucu ayrılır
Parse/validation/input coercion nedeniyle başlamayan execution, errors içeren ama data alanı olmayan request error result verir. Başlamış execution’ın field hatası data ile errors’u birlikte verebilir; data:null ile data alanının hiç bulunmaması aynı değildir. Browser network başarısı veya HTTP status tek başına bütün seçili field’ların başarılı olduğunu kanıtlamaz. UI book objesinin varlığını ve error path’lerini birlikte okuyarak title gösterip subtitle için yerel hata durumu seçebilir; internal exception text’i kullanıcıya olduğu gibi dökmek gerekmez.
Released GraphQL September 2025 execution spec belirli bir HTTP status zorunlu kılmaz; transport ayrı profildir. İncelenen current GraphQL-over-HTTP draft body/media type ile status kurallarını ayrıca ele alır. Okunan sürümde partial data+errors için §5.4 custom 294 önerirken §5.4.1 execution-error örneği 200 der; bu tutarsız draft metni bütün deployment’ların contract’ı sayılmaz. Artifact HTTP status uydurmaz: result body ve execution ledger’ı gösterir. Gerçek client pin edilmiş server/adapter profile, media type ve gateway error response’unu doğrulamalıdır; "GraphQL hep 200 döner" de "partial result her yerde 294’tür" de güvenilir genelleme değildir.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
Validation reddi
- Selection ve context ayrıldı
BookTitle query’si book için id, title ve subtitle seçer. Schema field’larını bilmek, reader-A için object permission kararı verilmiş olması demek değildir.
- Operation ve schema
- Query selection
- Validation/completion kararı
- Permission ayrı
- Consumer yorumu
- Execution bekliyor
- Negatif selection kaydı seçildi
validation-denied row’u subtitle yerine caption içerir. parseDeclared=true ve variablesDeclaredValid=true olsa da caption schema’daki Book field’ı değildir.
- Operation ve schema
- Selected: caption
- Validation/completion kararı
- Parse declared=true
- Consumer yorumu
- Validation bekliyor
- Execution öncesi validation durdu
Bu row resolverCalls=0 ve Unknown selected field error’ı bildirir. Geçerli syntax, execution aşamasına otomatik geçiş değildir.
- Operation ve schema
- Resolver calls=0
- Validation/completion kararı
- Request error known
- Consumer yorumu
- No execution data
- Request error shape’i korundu
Result yalnız errors içerir; data alanı yoktur. Bu shape execution sırasında bir field’ın null dönmesiyle aynı durum değildir.
- Operation ve schema
- errors present
- Validation/completion kararı
- data absent
- Consumer yorumu
- Execution did not begin
- Permission sonucuna sıçranmadı
Caption uyuşmazlığı schema sorusunu cevaplar. Bu ret actor’ın authenticated olmadığı, başka book’a erişebildiği veya service policy’den geçtiği sonucunu vermez.
- Operation ve schema
- Validation deny known
- Validation/completion kararı
- Permission unestablished
- Consumer yorumu
- Resource body yok
- Model ve engine sınırı ayrıldı
Bu ledger parse ve field sonuçlarını tanımlar; actualParser=false ve actualEngine=false’tur. Resolver sayısı verilen profile aittir, production engine trace’i değildir.
- Operation ve schema
- Declared pipeline
- Validation/completion kararı
- No engine execution claim
- Consumer yorumu
- No resource delivery
Non-null etkisi
- Field nullability zinciri okundu
Seçilen schema’da title:String! iken book nullable’dır. title için completion hatası, en yakın nullable parent olan book’a yayılabilir.
- Operation ve schema
- title: non-null
- Validation/completion kararı
- book: nullable
- Consumer yorumu
- Completion bekliyor
- Title failure row’u seçildi
nonnull-error row’u resolverFault=title ve resolverCalls=4 bildirir. Bu profile bütün field sonuçları completion’dan önce hazırdır; genel executor sırası iddia edilmez.
- Operation ve schema
- Fault: title
- Validation/completion kararı
- Declared calls=4
- Consumer yorumu
- Result henüz tamamlanmadı
- Error parent’a yayıldı
Result data.book=null olur ve error path book/title olarak kalır. Eski title veya başarılı subtitle’ı yeni tam Book sonucu gibi göstermek contract’ı bozar.
- Operation ve schema
- data.book=null
- Validation/completion kararı
- Path: book/title
- Consumer yorumu
- Book view unavailable
- Başka schema varsayılmadı
Artifact’ın rootBookNonNullVariant değeri seçilmeyen başka bir schema örneğidir. Burada book nullable olduğundan data object’i korunur; data=null diye genişletilmez.
- Operation ve schema
- Selected book nullable
- Validation/completion kararı
- data object retained
- Consumer yorumu
- No schema substitution
- Nullable subtitle ile fark kuruldu
subtitle hatasında title kalabilir ve subtitle=null olur. title non-null hatasında book’un kaybı, network hızından değil nullability zincirinden doğar.
- Operation ve schema
- Subtitle: partial Book
- Validation/completion kararı
- Title: Book=null
- Consumer yorumu
- Blast radius schema-bound
- Transport sonucu uydurulmadı
GraphQL result shape’i tek başına HTTP status seçmez. transportStatusMode=not-modeled olduğu için bu completion sonucuna otomatik 200 veya 500 eklenmez.
- Operation ve schema
- Execution error known
- Validation/completion kararı
- HTTP status not modeled
- Consumer yorumu
- No stale Book delivery
VARSAYIM · SINIR · KONTROL
Schema görünürse resource izinli mi?
Schema’da book field’i olması yalnız field’in API sözleşmesinde bulunduğunu gösterir. ID variable’ının kabulü, authenticated connection veya selection validation subject’in o resource’u okuyabildiğini söylemez. Authorization, server’ın güvenilir context’inden object/action kararıyla resolver veya onun çağırdığı service sınırında uygulanır. Riskli varsayım root resolver’ın genel bir allow kararının bütün nested field’lara yetmesidir. Daha hassas author/profile alanı eklendiğinde kendi field/resource policy’si gerekebilir; public schema bir permission listesi değildir.
Örneğin resolver context’i permissionAllowed=true koşuluyla başlar; authentication veya database tenant isolation burada doğrulanmaz. Query’nin başarılı olması bütün sibling field’ların aynı izni taşıdığı anlamına gelmez. Parse success’ı permission yerine koymak, client variable’ını trusted context saymak veya cache’i subject/tenant bağından bağımsız paylaşmak ayrı kontrol sorunlarıdır. Response shape’i bu sorunların kök nedenini tek başına kanıtlamaz; context’in kaynağı ve her resource kararının uygulandığı yer de incelenir.
Partial sonucu tam başarı sanmak
subtitle hatası response’a taşınırken title başarıyla dönebilir. Bütün errors’u global failure’a dönüştürmek kullanılabilir bilgiyi gereksizce kaybettirir; yalnız data var diye errors’u yok saymak da yanlış subtitle göstermeye neden olabilir. Non-null değişikliğinin blast radius’u önemlidir: optional bilgiyi gereksizce non-null yapmak küçük resolver hatasında bütün Book görünümünü boşaltabilir. Artifact aynı normal kaydın iki field-error sonucunu yan yana koyar; fark network hızı değil schema’daki nullability zinciridir.
Request error ile execution error’ı aynı telemetry etiketiyle saymak sorun kaynağını örter. Unknown caption için resolver call count sıfır olmalıdır; nullable subtitle error için execution başlamıştır. Ayrıca mutation root field’larının serial execution özelliği nested işlemlerin transactional veya her field’in sıralı olduğu garantisi değildir. Timeout, cancellation, resource cost ve downstream failure policy uygulama tasarımıdır. İzin kontrolü ve normal kapasite limit’i birlikte ele alınır; type-safe selection sınırsız iş yapma hakkı vermez.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
Partial data
- Nullable field observation seçildi
nullable-error row’u resolverFault=subtitle ve resolverCalls=4 içerir. Validation reddi değildir; execution result’ında data ile errors birlikte bulunur.
- Result/context gözlemi
- Fault: subtitle
- Pipeline karşılaştırması
- Calls=4
- İnceleme sonucu
- Completion review pending
- Kullanılabilir data alanları okundu
book.id=book-A ve title=Atlas Notları korunur, subtitle=null’dır. Data varlığı error’ın yokluğunu; error varlığı bütün data’nın kullanılamazlığını göstermez.
- Result/context gözlemi
- id/title present
- Pipeline karşılaştırması
- subtitle=null
- İnceleme sonucu
- Partial result known
- Error path data alanına bağlandı
Error path book/subtitle’dır. Human-readable Subtitle unavailable mesajı kalıcı field identifier yerine geçirilmez; path response field konumunu anlatır.
- Result/context gözlemi
- Path: book/subtitle
- Pipeline karşılaştırması
- Error/data linkage
- İnceleme sonucu
- Message ≠ stable ID
- Client yorumunun sınırı yazıldı
Title kullanılabilir olabilir ama subtitle için hata durumu açık kalmalıdır. Bu documentary inceleme gerçek DOM render’ın yapıldığını veya client’ın doğru state tuttuğunu kanıtlamaz.
- Result/context gözlemi
- Title available in result
- Pipeline karşılaştırması
- Subtitle error retained
- İnceleme sonucu
- DOM outcome unobserved
- Call count profile’a bağlandı
Dört call bu ledger’ın seçili completion profile’ına aittir. Gerçek executor pending sibling işini iptal edebilir; aynı count bütün engine’ler için beklenmez.
- Result/context gözlemi
- Declared calls=4
- Pipeline karşılaştırması
- Cancellation not modeled
- İnceleme sonucu
- No universal count claim
- Review tuple’ı tamamlandı
Validation sonucu, resolver invocation, data shape ve error path birlikte tutulur. HTTP adapter status’u ve permission enforcement için ayrıca kanıt gerekir.
- Result/context gözlemi
- Partial completion known
- Pipeline karşılaştırması
- Adapter evidence separate
- İnceleme sonucu
- Permission evidence separate
Resolver context
- Context provenance kaydı açıldı
Context reader-A, tenant-A ve permissionAllowed=true içerir; provenanceDeclared=owned handler’dır. Bunlar ledger önkoşullarıdır, gerçek login veya token validation gözlemi değildir.
- Result/context gözlemi
- reader-A / tenant-A
- Pipeline karşılaştırması
- Permission declared=true
- İnceleme sonucu
- Provenance review pending
- Variable ve trusted context ayrıldı
variables.id=book-A hangi resource’ın istendiğini seçer. Variable’ın schema’ya uyması onu authenticated subject veya server tenant authority yapmaz.
- Result/context gözlemi
- Variable selects book-A
- Pipeline karşılaştırması
- Context selects subject/tenant
- İnceleme sonucu
- Authority roles separate
- Normal result context ile karşılaştırıldı
Normal row id, title ve subtitle’ı döndürür. Bu olumlu shape yalnız verilen context altında declared sonucu gösterir; bütün nested resource policy’lerini gözlemez.
- Result/context gözlemi
- Normal result complete
- Pipeline karşılaştırması
- Context precondition declared
- İnceleme sonucu
- Nested policies unobserved
- Cache scope inceleme sorusu kaldı
Subject/tenant bağının loader ve cache’te korunması gerekir. Artifact cache uygulaması göstermediği için normal Book sonucu bu bağların doğru uygulandığını kanıtlamaz.
- Result/context gözlemi
- Cache binding required
- Pipeline karşılaştırması
- Cache evidence missing
- İnceleme sonucu
- No clean cache conclusion
- Connection authority’ye çevrilmedi
connectionGrantsObjectPermission=false ayrı bir sınırdır. HTTP veya başka bağlantının kurulması book-read kararının yerine geçmez; schema görünürlüğü de permission listesi değildir.
- Result/context gözlemi
- Connection ≠ object permission
- Pipeline karşılaştırması
- Schema ≠ grant list
- İnceleme sonucu
- Per-resource decision needed
- Sonuç doğru kanıt düzeyinde kaldı
İnceleme normal result’ın verilen context’e bağlı olduğunu gösterir. Authentication, tenant storage isolation veya actual engine davranışı bu kayıtların dışında kalır.
- Result/context gözlemi
- Declared context/result linked
- Pipeline karşılaştırması
- Runtime identity unobserved
- İnceleme sonucu
- No broader acceptance claim
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Pipeline’ın kararlarını ayrı gözle
Schema edition ve operation contract pin edilir; parse, validation, variable coercion, resolver invocation ve completion outcome ayrı kaydedilir. Sensitive value veya bütün query text’i log’a koymadan operation alias, correlation ID ve sınırlı error path yeterli olabilir. Unknown field branch’ında no-execution kanıtı resolver count=0’dır. Normal branch’ta count ve response selection eşleşir. Buradaki count local fixture ledger’ıdır; production engine instrumentation, distributed trace veya query planner performansı olarak sunulmaz. Artifact count’u bütün seçili field outcome’larının completion’dan önce hazır olduğu profile aittir; gerçek executor pending sibling işini iptal edebilir.
Trusted context request handler tarafından oluşturulur; user-provided tenant alanı context’e güvenilir kimlik olarak kopyalanmaz. Object read kararı local service’in hangi kayıtları verebileceğini belirler; error shape hassas internal detay taşımadan contract’a uygun kalır. Request-scope cache ve loader gibi optimizasyonlar permission bağını korur. Resolver’ın in-memory olması policy’yi gereksiz yapmaz, network olması da policy’yi kendiliğinden sağlamaz. Review’in odağı çağrı sayısından önce hangi resource kararının nerede verildiğidir.
Client rendering’i nullability’ye bağla
Regression aynı book için dört ordinary outcome tutar: full result, validation-before-execution denial, nullable subtitle failure ve non-null title propagation. Client absent data’yı data:null’dan ayırır; non-null title branch’ında eski title değerini yeni book response’u gibi göstermemelidir. Partial subtitle branch’ında title kullanılabilir ama subtitle error state’i açık kalır. Error path değiştiğinde UI mapping’i alias-aware test edilir; human-readable message sürekli identifier olarak kullanılmaz.
HTTP adapter’ın media type ve error status policy’si ayrıca doğrulanır; core execution sonucu gateway davranışını tek başına belirlemez. GraphQL-over-HTTP draft önerileri kullanılan implementation’ın desteğiyle birlikte değerlendirilir. Sahne client/server request ve result arrival anlarını gösterir; parse, validate, resolve ve complete server içindeki local stage’lerdir. Artifact typed result ledger’ını açıklar; gerçek GraphQL engine’in scheduling’i, HTTP adapter’ı ve storage entegrasyonu bu tabloya indirgenmez.
ŞİMDİ VAKAYA UYGULA
Validation, execution ve permission hangi ayrı kanıtları ister?
Typed ledger unknown caption, nullable subtitle ve non-null title sonuçlarını ayırır. Resolver context’i bir önkoşuldur; data shape’i gerçek authentication veya HTTP status kanıtı değildir.
Vakadaki API contract’ı ile browser’ın okuyabildiği representation’ı ayrı incele. Envelope, data, error ve resource permission için hangi gözlemin yeterli olduğunu tartış.
Bağlı vaka dosyasını aç ↗ÖRNEĞİ BİRLİKTE OKUYALIM
Atlas typed execution ledger
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"profile": {
"releasedEdition": "September 2025",
"operationKind": "query",
"transportStatusMode": "not-modeled",
"actualParser": false,
"actualEngine": false,
"permissionDeclared": true,
"localPersistence": true,
"allFieldResultsDeclaredBeforeCompletion": true,
"cancellationNotModeled": true,
"executorMayCancelPendingSiblings": true
},
"schemaSDL": "type Query { book(id: ID!): Book }\ntype Book { id: ID! title: String! subtitle: String }",
"operation": "query BookTitle($id: ID!) { book(id: $id) { id title subtitle } }",
"variables": {
"id": "book-A"
},
"types": {
"book": {
"nullable": true
},
"id": {
"nullable": false
},
"title": {
"nullable": false
},
"subtitle": {
"nullable": true
}
},
"context": {
"subject": "reader-A",
"tenant": "tenant-A",
"permissionAllowed": true,
"provenanceDeclared": "owned handler"
},
"record": {
"id": "book-A",
"title": "Atlas Notları",
"subtitle": "Web rehberi"
},
"rows": [
{
"case": "normal",
"selectedFields": [
"id",
"title",
"subtitle"
],
"parseDeclared": true,
"variablesDeclaredValid": true,
"resolverFault": null,
"resolverCalls": 4,
"result": {
"data": {
"book": {
"id": "book-A",
"title": "Atlas Notları",
"subtitle": "Web rehberi"
}
}
}
},
{
"case": "validation-denied",
"selectedFields": [
"id",
"title",
"caption"
],
"parseDeclared": true,
"variablesDeclaredValid": true,
"resolverFault": null,
"resolverCalls": 0,
"result": {
"errors": [
{
"message": "Unknown selected field"
}
]
}
},
{
"case": "nullable-error",
"selectedFields": [
"id",
"title",
"subtitle"
],
"parseDeclared": true,
"variablesDeclaredValid": true,
"resolverFault": "subtitle",
"resolverCalls": 4,
"result": {
"data": {
"book": {
"id": "book-A",
"title": "Atlas Notları",
"subtitle": null
}
},
"errors": [
{
"message": "Subtitle unavailable",
"path": [
"book",
"subtitle"
]
}
]
}
},
{
"case": "nonnull-error",
"selectedFields": [
"id",
"title",
"subtitle"
],
"parseDeclared": true,
"variablesDeclaredValid": true,
"resolverFault": "title",
"resolverCalls": 4,
"result": {
"data": {
"book": null
},
"errors": [
{
"message": "Title unavailable",
"path": [
"book",
"title"
]
}
]
}
}
],
"pipeline": [
"parse",
"validate",
"coerce variables",
"resolve with trusted context",
"complete typed fields",
"build execution result"
],
"allNonNullQualification": {
"rootBookNonNullVariant": true,
"rootDataOnTitleError": null,
"notSelectedSchema": true
},
"httpScope": {
"corePrescribesStatus": false,
"draftURL": "https://http-spec.graphql.org/draft/",
"draftReviewed": "2026-10-08",
"draftPartialRecommendation": 294,
"finalStandard": false,
"actualHTTP": false,
"draftExampleExecutionErrorStatus": 200,
"draftRecommendationsConflict": true
},
"boundaries": {
"schemaGrantsPermission": false,
"connectionGrantsObjectPermission": false,
"errorPathUsesResponseNames": true,
"requestErrorOmitsData": true
}
}- schemaSDL
- Seçilmiş query schema ve nullable Book/subtitle zinciri.
- rows
- Aynı kaydın dört outcome’u; GraphQL engine çalıştırıldığı iddia edilmez.
- types
- Field error’ın hangi nullable ancestor’da durduğu.
- context
- Permission sonucu declared; client variable ile trusted context farklı.
- httpScope
- Released core ile değişebilir HTTP draft/profile sınırı.
Inert SDL, read document ve typed result ledger kullanılır. Gerçek GraphQL parser/validator/engine, endpoint, HTTP status veya database execution sonucu değildir.
İki yanlış kanı
Schema validation izin kontrolüdür.
Validation operation’ın type sözleşmesini kontrol eder; object/action permission trusted context ile ayrıca uygulanır.
errors varsa data bulunamaz.
Execution error partial data ile birlikte olabilir; execution öncesi request error data alanını içermez.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
Query id, title ve caption seçiyor; caption schema’da yok. Resolver çalıştırılır mı?
- Hayır. resolverCalls=0; request errors var, data yok.
- Evet. Resolver unknown field için null döndürür.
Gerekçeli cevabı oku
Hayır. resolverCalls=0; request errors var, data yok. — Validation reddedilince execution aşamasına geçilmez. Syntax’ın parse edilmesi, seçilen field’ın geçerli olduğunu göstermez.
title non-null hatası neden data.book=null sonucuna yayılıyor?
Dersten seçilen artifact alanları; öğretim örneği
- types.title
- {"nullable":false}
- types.book
- {"nullable":true}
- rows[3].result
- {"data":{"book":null},"errors":[{"message":"Title unavailable","path":["book","title"]}]}
- Yalnız title kaldırılır; book her zaman eksiksiz kalır.
- title null olamaz; hata nullable book parent’a yayılır.
Gerekçeli cevabı oku
title null olamaz; hata nullable book parent’a yayılır. — Bu schema’da book nullable’dır. errors path book/title alanını gösterirken completion sonucu parent olan book null olur.
Nullable subtitle hatası data ve errors birlikte döndürüyor. Neden bütün data’nın yok olduğunu veya belirli bir HTTP status’u çıkaramayız?
Gerekçeli cevabı oku
Validation’dan geçen query çalıştırıldığında nullable field hatası subtitle=null üretebilir; id ve title kullanılabilir kalırken errors da bulunur. Request validation hatasında ise data alanı verilmez. GraphQL core tek başına HTTP status mapping belirlemez. Bu artifact gerçek GraphQL engine veya HTTP çalıştırmaz; verilen sibling sonuçları execution timing garantisi değildir.
□ Request hatası ile execution hatasını ayırdım.
□ Data/errors biçiminden belirli bir HTTP status çıkarmadım.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- GraphQL Specification — September 2025 released edition§2.1 language parsing; §6.1.1 validation; §6.1.2 variable coercion · §6.4.2 resolving fields; §6.4.3 completion; §6.4.4 errors · §7.1.1 execution result; §7.1.3 request error result; §7.1.4 response position · §6.3.3 Non-Null sibling cancellation; §6.3.4 normal and serial execution
- GraphQL over HTTP — current draft§5.1 body/media type; §5.4 status codes · §6.1 Partial success; custom 294 draft qualification · §5.4 custom 294 recommendation versus §5.4.1 execution-error 200 example: reviewed inconsistency