Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

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?

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Tam sonuç

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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ı
  3. 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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ı?

  1. Hayır. resolverCalls=0; request errors var, data yok.
  2. 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"]}]}
  1. Yalnız title kaldırılır; book her zaman eksiksiz kalır.
  2. 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