Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-17.01

API contracts, endpoints ve REST

Bir endpoint URL’den fazlasıdır: method, representation, status ve operation semantics birlikte contract oluşturur. REST’in architecture sınırını JSON API alışkanlığından ayır.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

GET JSON

  1. Contract seç

    Client GET /api/notes/tea ve Accept: application/json seçimini hazırladı. Bu public read niyetidir; endpoint henüz request almadı ve client’ta response yoktur.

    Duru / Client
    GET /api/notes/tea; Accept: application/json hazır
    API endpoint
    No request
    Resource owner
    No selection
    Client contract
    No validation
  2. Request ulaştı

    Endpoint method/target ve Accept’i aldı; resource selection ve representation policy henüz bitmedi.

    Duru / Client
    Waiting response
    API endpoint
    GET /api/notes/tea received
    Resource owner
    No selection
    Client contract
    No validation
  3. Resource seç

    Logical note sabit public resource owner’dan seçilir; resource bir JSON byte string’iyle aynı şey değildir.

    Duru / Client
    Waiting response
    API endpoint
    GET /api/notes/tea received
    Resource owner
    Selected public tea note
    Client contract
    No validation
  4. Media ve status

    Server public note için 200 application/json body’sini hazırladı: id=tea, title=Tea note ve links array. JSON representation 80 UTF-8 octet’tir; client henüz almadı.

    Duru / Client
    Waiting response
    API endpoint
    200 JSON ready
    Resource owner
    Selected public tea note
    Client contract
    No validation
  5. Response ulaştı

    Client selected response’u şimdi aldı; prepared representation ile received representation aynı zaman değildir.

    Duru / Client
    200 JSON received
    API endpoint
    200 JSON ready
    Resource owner
    Selected public tea note
    Client contract
    No validation
  6. Contract kontrolü

    Client aldığı JSON body’yi yerel olarak parse eder ve id/title string, links array koşullarını kontrol eder. Seçilen normal body bu shape’e uyar; HTTP 200 tek başına bu sonucu veya resource iznini kanıtlamaz.

    Duru / Client
    200 JSON received
    API endpoint
    200 JSON ready
    Resource owner
    Selected public tea note
    Client contract
    id/title strings; links array

HEAD metadata

  1. Contract seç

    Client HEAD /api/notes/tea ve Accept: application/json seçimini hazırladı. Bu public read niyetidir; endpoint henüz request almadı ve client’ta response yoktur.

    Duru / Client
    HEAD /api/notes/tea; Accept: application/json hazır
    API endpoint
    No request
    Resource owner
    No selection
    Client contract
    No validation
  2. Request ulaştı

    Endpoint method/target ve Accept’i aldı; resource selection ve representation policy henüz bitmedi.

    Duru / Client
    Waiting response
    API endpoint
    HEAD /api/notes/tea received
    Resource owner
    No selection
    Client contract
    No validation
  3. Resource seç

    Logical note sabit public resource owner’dan seçilir; resource bir JSON byte string’iyle aynı şey değildir.

    Duru / Client
    Waiting response
    API endpoint
    HEAD /api/notes/tea received
    Resource owner
    Selected public tea note
    Client contract
    No validation
  4. Media ve status

    Server HEAD için 200 ve Content-Length: 80 metadata’sını hazırladı; response content’i yoktur. Uzunluk aynı JSON GET representation’ına aittir, client henüz almadı.

    Duru / Client
    Waiting response
    API endpoint
    200 HEAD ready
    Resource owner
    Selected public tea note
    Client contract
    No validation
  5. Response ulaştı

    Client selected response’u şimdi aldı; prepared representation ile received representation aynı zaman değildir.

    Duru / Client
    200 HEAD; 0 content
    API endpoint
    200 HEAD ready
    Resource owner
    Selected public tea note
    Client contract
    No validation
  6. Contract kontrolü

    Client HEAD metadata’sını değerlendirir: Content-Length: 80 ile content octet sayısı 0 farklıdır. Body olmadığı için JSON parse edilmez; bu sonuç note’un boş olduğunu göstermez.

    Duru / Client
    200 HEAD; 0 content
    API endpoint
    200 HEAD ready
    Resource owner
    Selected public tea note
    Client contract
    Metadata only; no JSON parse

Media refusal

  1. Contract seç

    Client GET /api/notes/tea ve Accept: image/png seçimini hazırladı. Bu public read niyetidir; endpoint henüz request almadı ve client’ta response yoktur.

    Duru / Client
    GET /api/notes/tea; Accept: image/png hazır
    API endpoint
    No request
    Resource owner
    No selection
    Client contract
    No validation
  2. Request ulaştı

    Endpoint method/target ve Accept’i aldı; resource selection ve representation policy henüz bitmedi.

    Duru / Client
    Waiting response
    API endpoint
    GET /api/notes/tea received
    Resource owner
    No selection
    Client contract
    No validation
  3. Resource seç

    Logical note sabit public resource owner’dan seçilir; resource bir JSON byte string’iyle aynı şey değildir.

    Duru / Client
    Waiting response
    API endpoint
    GET /api/notes/tea received
    Resource owner
    Selected public tea note
    Client contract
    No validation
  4. Media ve status

    Accept: image/png bu profilin JSON/plain media kümesine uymaz. Server bu örnekte 406 ret response’u hazırlar; HTTP bütün media uyuşmazlıklarında bu seçimi zorunlu kılmaz.

    Duru / Client
    Waiting response
    API endpoint
    406 ready
    Resource owner
    Selected public tea note
    Client contract
    No validation
  5. Response ulaştı

    Client selected response’u şimdi aldı; prepared representation ile received representation aynı zaman değildir.

    Duru / Client
    406 received
    API endpoint
    406 ready
    Resource owner
    Selected public tea note
    Client contract
    No validation
  6. Contract kontrolü

    Client aldığı 406’yı bu contract’ın beklenen media reddi olarak yorumlar. Normal note JSON shape’i doğrulanmış sayılmaz; method desteği, media seçimi ve resource izni ayrı sorulardır.

    Duru / Client
    406 received
    API endpoint
    406 ready
    Resource owner
    Selected public tea note
    Client contract
    Expected media refusal

Follow note link

  1. Entry seç

    Client documented entry target /api’yi bilir; note resource target’ı response relation’dan seçilecektir.

    Duru / Client
    GET /api hazır; note target bilinmiyor
    API endpoint
    No request
    Resource owner
    Public note ready
    Client contract
    No relation
  2. Entry request

    Endpoint public entry GET’ini aldı ve known note relation’ını içeren representation’ı hazırlayabilir.

    Duru / Client
    Waiting entry
    API endpoint
    GET /api received
    Resource owner
    Public note ready
    Client contract
    No relation
  3. Relation üret

    Server rel=note href=/api/notes/tea representation’ını local olarak hazırlar; client henüz bunu almadı.

    Duru / Client
    Waiting entry
    API endpoint
    Entry links ready
    Resource owner
    Public note ready
    Client contract
    No relation
  4. Entry ulaştı

    Client entry representation’ı aldı; href’i yalnız documented note relation semantics’i ile yorumlar.

    Duru / Client
    Entry links received
    API endpoint
    Entry links ready
    Resource owner
    Public note ready
    Client contract
    No relation
  5. Relation seç

    Client entry’deki rel=note ilişkisini yerel olarak seçti ve href=/api/notes/tea ile sonraki GET request’ini hazırladı. Henüz endpoint bu ikinci request’i almadı; başka target veya privileged action seçilmez.

    Duru / Client
    Entry alındı; GET /api/notes/tea hazır
    API endpoint
    Entry links ready
    Resource owner
    Public note ready
    Client contract
    note → /api/notes/tea
  6. Linked request

    Endpoint entry’deki href’le eşleşen benign GET target’ı aldı; independent request önceki server session context’i istemez.

    Duru / Client
    Entry links received
    API endpoint
    GET linked note received
    Resource owner
    Public note ready
    Client contract
    note → /api/notes/tea
  7. Note response

    Server public note representation’ını hazırlar; iki read interaction bütün REST constraints’ini kanıtlamaz.

    Duru / Client
    Entry links received
    API endpoint
    200 note ready
    Resource owner
    Public note ready
    Client contract
    note → /api/notes/tea
  8. Note ulaştı

    Client linked note response’unu aldı; ledger target equality’yi gösterir, complete REST conformity iddiası taşımaz.

    Duru / Client
    200 linked note received
    API endpoint
    200 note ready
    Resource owner
    Public note ready
    Client contract
    note → /api/notes/tea

ROLLER · STATE · VERİ AKIŞI

API bir interaction contract’ıdır

API bir component’in diğer component’e sunduğu operation/data contract’ını anlatır; her API web üzerinden çalışmaz. Web API bu interaction’ı web protocol üzerinden erişilebilir kılar. Atlas GET /api/notes/tea endpoint’i method ve target’ın birlikte seçtiği read operation’dır. URL’nin sonuna api yazmak veya response’u JSON yapmak kendiliğinden contract’ın tamamını açıklamaz. İzin verilen method’lar, headers, representation shape ve error anlamları da okunmalıdır.

Resource tea note’unun logical kimliğidir; representation ise o resource hakkında aktarılan bytes ve metadata’dır. Aynı resource application/json veya text/plain ile ifade edilir. Contract JSON için id ve title string’leri ile links array’ini tanımlar; plain için Tea note text’ini verir. Client HTTP status, Content-Type ve expected shape’i ayrı kontrol eder. 200 ve parse edilebilir JSON, yanlış field type’larını doğru yapmaz. Bir endpoint database table veya disk file’ın doğrudan adresi olmak zorunda değildir.

GET bu public resource’un representation’ını okur; HEAD selected metadata’yı content taşımadan verir. POST bu read-only endpoint’te 405 ve Allow: GET, HEAD üretir. GET’in safe semantics’i request’in state change talep etmemesidir; logging gibi incidental işler olabilir. Safe/idempotent classification object authorization kontrolünü yerine getirmez. Fixture’de identity yoktur ve public catalog okunur. Write API’de operation sonucu ile persistence outcome ayrıca tanımlanmalıdır.

REST constraints, representation ve hypermedia

REST Fielding’in tanımladığı architecture style’dır: client-server, stateless interaction, cache constraints, uniform interface ve layered system birlikte düşünülür; code-on-demand optional’dır. Uniform interface resource identification, representation ile manipulation, self-descriptive messages ve hypermedia’nın application state’i yönlendirmesini kapsar. Yalnız JSON ve CRUD benzerliği bu constraints’in hepsini karşıladığını göstermez.

Stateless interaction’da her request’i anlamak için gerekli context o request’te bulunur; önceki interaction’ın server’da tutulan client session context’ine bağımlılık kurulmaz. Bu server’ın resource data’sı, database’i veya cache’i olamaz demek değildir. Server-side session kullanan yaygın JSON API’ler çalışabilir; fakat bu özellik REST’in strict stateless constraint’iyle aynı değildir. HTTP protocol’un stateless semantics’i ile bir uygulamanın session design’ını ayrı değerlendir.

Örnekte entry representation /api, rel=note ve href=/api/notes/tea link’ini döndürür; client bu documented relation’ı okuyup public target’a GET yapar. Link’i kullanarak ilerlemek hypermedia fikrini somutlaştırır; bu tek küçük örnek bütün API’nin REST conformity’sini kanıtlamaz. Accept: text/plain alternate representation seçer. Fixture image/png için 406 seçer; HTTP origin’in bütün negotiation uyuşmazlıklarında zorunlu olarak 406 vermesi gerekmez. Status, body shape ve supported-media contract birlikte okunur.

2. Red · Güven ve etki

Hareket olmadan bütün senaryoları oku

Shape uyuşmaz

  1. API consumer contract’ı okundu

    public tea note contract’ı id:string, title:string ve links:array ister. JSON olarak okunabilme ile consumer’ın beklediği shape’e uyum farklı koşullardır.

    API contract kaydı
    Contract: id string
    Contract gate incelemesi
    Candidate incelenmedi
    Consumer sınırı
    Consumer kabul etmedi
  2. Aday representation seçildi

    invalidCandidate içinde id=7, title=Tea note ve links=[] vardır. Bu yalnız değerlendirme için verilmiş candidate’tır; endpoint’in bu body’yi gönderdiği kayıtlı değildir.

    API contract kaydı
    Candidate: id=7
    Contract gate incelemesi
    Served=false
    Consumer sınırı
    Consumer bekliyor
  3. Parser sonucu authority olmadı

    parseable=true, JSON syntax’ın okunabildiğini gösterir. id alanı number olduğu için string isteyen contract henüz sağlanmış değildir.

    API contract kaydı
    Parseable=true
    Contract gate incelemesi
    id type: number
    Consumer sınırı
    Shape sonucu bekliyor
  4. Shape gate’inde uyuşmazlık bulundu

    schemaValid=false bilinen contract uyuşmazlığıdır. HTTP status veya application/json etiketi id alanının türünü düzeltmez.

    API contract kaydı
    Parseable=true
    Contract gate incelemesi
    Schema valid=false
    Consumer sınırı
    Accepted representation değil
  5. Gerçek response iddiası kurulmadı

    servedByNativeEndpoint=false sınırı korunur. Bu candidate’ı canlı endpoint hatası veya kaydedilmiş malformed response olarak raporlamak kanıtı genişletir.

    API contract kaydı
    Candidate known
    Contract gate incelemesi
    Contract mismatch known
    Consumer sınırı
    Endpoint incident kanıtı yok
  6. Contract ve permission ayrı bırakıldı

    Shape doğrulaması consumer veri beklentisini sınırlar; resource permission sağlamaz. Burada public not contract’ı incelenir, başka objelere erişim yetkisi verilmez.

    API contract kaydı
    Shape gate gerekli
    Contract gate incelemesi
    Permission ayrı soru
    Consumer sınırı
    Consumer acceptance withheld

Method sınırı

  1. Endpoint method listesi okundu

    /api/notes/tea yalnız GET ve HEAD tanımlar. Resource path’inin varlığı, bütün HTTP method’larının o target’ta desteklendiğini göstermez.

    API contract kaydı
    Allowed: GET, HEAD
    Contract gate incelemesi
    Method kararı bekliyor
    Consumer sınırı
    Permission bilinmez
  2. Method mismatch kaydı seçildi

    methodMismatch row’u POST için status=405 ve Allow=GET, HEAD bildirir. İnceleme bu fixed karar kaydını okur; yeni request göndermez.

    API contract kaydı
    Method: POST
    Contract gate incelemesi
    Expected: 405
    Consumer sınırı
    Permission bilinmez
  3. Method desteği ret nedeni oldu

    405 target’ın bu method’u desteklemediğini açıklar. Actor için başarılı authentication veya object authorization sonucu bu kayıtta yoktur.

    API contract kaydı
    POST unsupported
    Contract gate incelemesi
    Allow: GET, HEAD
    Consumer sınırı
    No authority conclusion
  4. Allow alanı grant olarak okunmadı

    Allow=GET, HEAD, desteklenen method’ları açıklar. Actor’ın bu method’larla her resource’ı okuyabileceği veya application policy’den geçtiği anlamına gelmez.

    API contract kaydı
    Method capabilities
    Contract gate incelemesi
    Allow ≠ permission
    Consumer sınırı
    Resource policy ayrı
  5. Media negotiation farklı karar sayıldı

    image/png isteyen negotiation kaydının status’u 406’dır. Bu örneğin ret politikasıdır; her server’ın aynı Accept koşulunda zorunlu olarak 406 vermesi beklenmez.

    API contract kaydı
    Method: 405
    Contract gate incelemesi
    Selected negotiation: 406
    Consumer sınırı
    Ret nedenleri farklı
  6. Response kararının kapsamı korundu

    Method desteği, representation seçimi ve permission farklı gate’lerdir. Tek bir status alanı diğer iki katmanın geçtiğini veya başarısız olduğunu kanıtlamaz.

    API contract kaydı
    Method gate bilinir
    Contract gate incelemesi
    Representation policy ayrı
    Consumer sınırı
    Permission sonucu yok

VARSAYIM · SINIR · KONTROL

Contract ile observed result’i karşılaştır

Controlled public endpoint’in contract’ını method/target, selected media type, status ve schema üzerinden oku. /api/notes/tea için JSON id alanının number olması parse success’e rağmen contract uyuşmazlığıdır. Bu supplied benign candidate’ı client predicate’i değerlendirir; production server’dan bozuk protocol veya saldırı response’u üretilmez. Olası etki yanlış application branch’i veya typed client’ın result’i kullanamamasıdır. Kontrol, transport success ile application contract validation’ı ayrı tutmaktır.

405 GET,HEAD policy’sini anlatır; permission granted anlamı taşımaz. 404 de absent logical resource ile deliberate concealment arasında tek başına ayrım sağlamaz. Public fixture’de bu auth soruları devreye girmez. Contract incelemesinin sınırı açıkça yazılırsa “endpoint cevap verdi, dolayısıyla bütün operation doğru” şeklindeki aşırı yorum engellenir. Response content ve metadata’nın hangi resource/representation’a ait olduğunu ilişkilendirmek gerekir.

REST etiketi ve state bağımlılığı

REST adı verilmiş bir JSON API’yi incelerken “resource URL var mı” sorusu yeterli değildir. Request’in anlamı önceki client interaction’ına bağlı server context gerektiriyorsa strict stateless constraint değerlendirmesi farklıdır. Bu durum tek başına bir vulnerability veya kullanılamaz ürün değildir; architecture iddiası ile actual behavior arasındaki farktır. Domain data’nın database’de bulunması aynı session dependency anlamına gelmez.

Hypermedia’da relation semantics ve representation contract’ı client’in sonraki transition’ı anlamasını sağlar. Yalnız href alanı görmek complete HATEOAS architecture kanıtı sayılmaz; consumer’ın onu nasıl yorumladığı gerekir. Bu derski entry-follow case yalnız documented note relation’ını kullanır. Arbitrary target, external link veya privileged operation denenmez. Defansif kontrol, desteklenen relation ile allowed read operation arasındaki bağın açık olmasıdır.

3. Blue · Güvenli geliştirme ve savunma

Hareket olmadan bütün senaryoları oku

HEAD byte kanıtı

  1. GET representation kaydı seçildi

    Normal JSON body’nin contentOctets değeri 80’dir. Aynı public resource’ın text/plain representation’ı Tea note metniyle 8 byte’tır; byte sayısı representation’a bağlıdır.

    HTTP observation
    JSON: 80 bytes
    Bağlam karşılaştırması
    Plain: 8 bytes
    İnceleme sonucu
    HEAD incelenmedi
  2. HEAD observation kaydı okundu

    HEAD kaydı status=200, declaredLength=80 ve contentOctets=0 içerir. Metadata ile bu response’da taşınan content miktarı ayrı alanlardır.

    HTTP observation
    HEAD status=200
    Bağlam karşılaştırması
    Declared length=80
    İnceleme sonucu
    Content octets=0
  3. Zero content boş resource sayılmadı

    HEAD response content taşımadığı için contentOctets=0’dır. Bu sıfır, GET representation’ının boş olduğunu veya storage record’unun bulunmadığını göstermez.

    HTTP observation
    HEAD: no content
    Bağlam karşılaştırması
    GET representation: 80
    İnceleme sonucu
    Empty resource çıkarımı yok
  4. Karşılaştırma tuple’ı tamamlandı

    Method, media type, status, declared length ve gerçek content sayısı birlikte okunur. Farklı media type’ların 80 ve 8 byte sonuçları aynı body’nin çelişkili ölçümü değildir.

    HTTP observation
    Method/media bağı gerekli
    Bağlam karşılaştırması
    Metadata ≠ content
    İnceleme sonucu
    Farklı representation
  5. Database sonucu varsayılmadı

    restBoundary databaseExecuted=false bildirir. HTTP byte kaydı için bir database query veya kalıcı write gerçekleştiği sonucu eklenmez.

    HTTP observation
    HTTP ölçümleri bilinir
    Bağlam karşılaştırması
    Database executed=false
    İnceleme sonucu
    Storage claim yok
  6. İnceleme sonucu representation’a bağlandı

    Bu kayıt HEAD semantiği ve byte ayrımını açıklar. Content delivery, DOM render veya başka media negotiation koşulları için ayrıca gözlem gerekir.

    HTTP observation
    HEAD content=0
    Bağlam karşılaştırması
    GET JSON length=80
    İnceleme sonucu
    Render sonucu bilinmez

Link relation

  1. Entry representation incelendi

    /api entry kaydı rel=note ve href=/api/notes/tea link’ini içerir. Bu ilişki bir sonraki documented target’ı seçmek için representation verisidir.

    HTTP observation
    Entry: /api
    Bağlam karşılaştırması
    rel=note
    İnceleme sonucu
    Next target bekliyor
  2. Relation seçimi kayda bağlandı

    followedRelation=note kaydı entry link’iyle eşleşir. İnceleme bu normal ilişkiyi okur; başka URL veya actor permission üretmez.

    HTTP observation
    Followed relation=note
    Bağlam karşılaştırması
    href=/api/notes/tea
    İnceleme sonucu
    Permission grant yok
  3. Next target eşleştirildi

    nextTarget=/api/notes/tea, seçilen href ile aynıdır. Bu belgeli geçiş, bir link ilişkisinden target seçimini gösterir; gerçek request receipt veya DOM sonucu değildir.

    HTTP observation
    Relation match known
    Bağlam karşılaştırması
    Next target match known
    İnceleme sonucu
    Receipt gözlemi yok
  4. REST kapsamı ayrı değerlendirildi

    completeRestConformanceClaim=false’tur. Tek bir link ve target eşleşmesi bütün REST constraint’lerinin uygulandığını kanıtlamaz.

    HTTP observation
    Link transition known
    Bağlam karşılaştırması
    Complete REST claim=false
    İnceleme sonucu
    Constraint review gerekli
  5. Stateless ile resource state ayrıldı

    serverResourceStateAllowed=true ve storedPreviousClientSessionContextUsed=false farklı soruları cevaplar. REST statelessness, server’da hiçbir resource verisi tutulmaması demek değildir.

    HTTP observation
    Resource state allowed
    Bağlam karşılaştırması
    Previous client context not used
    İnceleme sonucu
    State türleri ayrı
  6. Eksik observation temiz sonuç olmadı

    Selector’ın sıfır eşleşmesi yalnız verilen observation setini anlatır. Field veya kayıt eksikse contract doğruluğu, REST uyumu veya runtime temizliği sonucu çıkarılamaz.

    HTTP observation
    Observation set sınırlı
    Bağlam karşılaştırması
    Missing evidence ≠ clean
    İnceleme sonucu
    Ek gözlem gerekli

UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA

Contract ledger ve independent predicates

Artifact contract method’ları GET/HEAD, resource target’ı /api/notes/tea, supported media types’ı JSON/plain ve required JSON fields’ı id/title/links olarak kaydeder. Normal record status=200, media=application/json, schemaValid=true olur. Client predicate id/title string ve links array koşullarını ayrı hesaplar. Benign id=7 candidate’ı rejected olur; bu record yalnız local schema observation’dır, gerçek gateway log schema’sı değildir.

GET plain body Tea note sekiz UTF-8 octet’tir; HEAD JSON selected representation length’ini bildirse de content 0’dır. POST’in 405 ve Allow header’ı operation support için doğrulanır; unsupported image/png 406 fixture policy’sidir. Negotiation örneği yalnız absent/JSON/plain/image-png input set’ini seçer; bütün Accept quality/wildcard parsing’i uygulanmış sayılmaz. Cache behavior veya identity decision bu ledger’in scope’u değildir.

Schema selector ve hypermedia kanıtı

XPath count(/audit/response[@status="200" and @media="application/json" and @schema="invalid"]) successful HTTP response’un invalid application shape ile eşleştiği authored observation’ları sayar. Normal valid fixture 0, supplied positive fixture 1 verir. 406 veya expected 405 bu schema condition’ına girmez; onlar ayrı contract branch’leridir. Observation yoksa count 0 clean behavior kanıtı değildir; yeterli response ve validation verisi yoktur.

Entry document’in note relation’ından alınan href ile next request target’ın eşitliğini göster. Bu, hard-coded URL varsayımından daha somut bir link-follow kanıtıdır; yine de complete architecture değerlendirmesi değildir. HTTP method semantics, media contract ve error policy değişirse client transition’ı da yeniden düşünülmelidir. Her step’te server’ın hazırladığı representation ile client’in gerçekten aldığı representation’ı ayırmak response result’in ownership’ini korur.

Operation ve representation sözleşmesini uygula

Server desteklediği method ve media type’ları dispatch kararına bağlar; yalnız dokümana yazmak yetmez. Bu read contract’ında GET ve HEAD, business mutation başlatmaz; POST seçilen operation’a girmez. Safe method, herkesin her kaynağı okuyabileceği anlamına gelmez: private kaynağa geçildiğinde identity ve permission kararı ayrıca gerekir. JSON response’un Content-Type’ı gerçek serialization ile uyuşmalı, client ise id/title/links tiplerini kullanmadan önce doğrulamalıdır.

id=7 gibi yanlış shape’i alan client, status=200 diye onu normal note view model’ine dönüştürmez; anlaşılır contract hatası gösterir. Normal JSON ve plain branch’larını, desteklenmeyen method ve media branch’larından ayrı doğrula. Link-follow akışında yalnız belgelenen relation ve beklenen API kapsamı kullanılır; bulunan her href yeni bir trusted endpoint değildir. Response veya validation kaydı eksikse ne schema doğruluğu ne access kontrolü kanıtlanmıştır.

ŞİMDİ VAKAYA UYGULA

Parse, method desteği veya link ilişkisi hangi sonucu kanıtlamaz?

Public tea note contract’ında shape, HTTP method, media type ve relation farklı alanlardır. İnceleme candidate verisini gerçek response’dan ve byte metadata’sını delivery’den ayırır.

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

Public note API contract ve relation ledger

Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.

Ham kaydı ve alan açıklamalarını oku
{
  "contract": {
    "resource": "public tea note",
    "target": "/api/notes/tea",
    "allowedMethods": [
      "GET",
      "HEAD"
    ],
    "supportedMediaTypes": [
      "application/json",
      "text/plain"
    ],
    "requiredShape": {
      "id": "string",
      "title": "string",
      "links": "array"
    },
    "selectionScope": [
      "absent Accept",
      "application/json",
      "text/plain",
      "image/png"
    ],
    "fullAcceptParser": false
  },
  "normal": {
    "method": "GET",
    "status": 200,
    "contentType": "application/json",
    "representation": {
      "id": "tea",
      "title": "Tea note",
      "links": [
        {
          "rel": "self",
          "href": "/api/notes/tea"
        }
      ]
    },
    "body": "{\"id\":\"tea\",\"title\":\"Tea note\",\"links\":[{\"rel\":\"self\",\"href\":\"/api/notes/tea\"}]}",
    "contentOctets": 80,
    "schemaValid": true
  },
  "plain": {
    "body": "Tea note",
    "contentOctets": 8,
    "status": 200
  },
  "head": {
    "declaredLength": 80,
    "contentOctets": 0,
    "status": 200
  },
  "methodMismatch": {
    "method": "POST",
    "status": 405,
    "allow": "GET, HEAD"
  },
  "negotiation": {
    "accept": "image/png",
    "status": 406,
    "policy": "selected fixture refusal; not mandatory universal behavior"
  },
  "invalidCandidate": {
    "representation": {
      "id": 7,
      "title": "Tea note",
      "links": []
    },
    "parseable": true,
    "schemaValid": false,
    "servedByNativeEndpoint": false
  },
  "hypermedia": {
    "entryTarget": "/api",
    "entryRepresentation": {
      "links": [
        {
          "rel": "note",
          "href": "/api/notes/tea"
        }
      ]
    },
    "followedRelation": "note",
    "nextTarget": "/api/notes/tea",
    "completeRestConformanceClaim": false
  },
  "restBoundary": {
    "serverResourceStateAllowed": true,
    "storedPreviousClientSessionContextUsed": false,
    "databaseExecuted": false,
    "codeOnDemand": "optional architectural constraint; not executed"
  },
  "selector": {
    "language": "XPath",
    "xml": "<audit><response status=\"200\" media=\"application/json\" schema=\"valid\"/></audit>",
    "xpath": "count(/audit/response[@status=\"200\" and @media=\"application/json\" and @schema=\"invalid\"])",
    "expected": 0,
    "positiveFixtureXml": "<audit><response status=\"200\" media=\"application/json\" schema=\"invalid\"/></audit>",
    "positiveExpected": 1,
    "scope": "Only authored protocol-decision observations, not product log field names or a live HTTP capture.",
    "missingFieldBehavior": "Missing observation is insufficient evidence; zero matches is not proof of correct runtime behavior."
  }
}
contract
Method/target/media/schema ve supported operation’ın birlikte tanımı.
invalidCandidate
Benign supplied local schema counterexample; wire response değil.
hypermedia
Entry relation’dan seçilen target; full REST conformity iddiası yok.

Read-only public fixture; JSON shape predicate ve limited media selection. Write/identity/complete REST/cache veya general Accept parser doğrulaması değildir.

İki yanlış kanı

JSON ve CRUD endpoint’leri varsa API otomatik REST’tir.

REST architecture constraints ve uniform interface/hypermedia anlamı ayrıca gerekir; JSON bir representation seçeneğidir.

REST stateless ise server’da database veya resource state tutulamaz.

Constraint önceki client interaction context’ine bağımlı request’i dışlar; resource data ve database ayrı state kategorileridir.

SIRA SENDE

Bu hikâyeyi sen çöz.

Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.

JSON adayında id=7; title string ve links array. Parse edilebilmesi schemaValid için yeterli mi?

  1. Hayır. schemaValid=false; aday sunulmaz.
  2. Evet. Geçerli JSON bütün API sözleşmelerine uyar.
Gerekçeli cevabı oku

Hayır. schemaValid=false; aday sunulmaz. — JSON syntax ile field type kontrolü farklı aşamalardır. Number olan id, sözleşmenin istediği string değildir.

Entry representation içindeki rel:note link’inin takip edilmesi neyi öğretir?

Dersten seçilen artifact alanları; öğretim örneği

hypermedia
{"entryTarget":"/api","entryRepresentation":{"links":[{"rel":"note","href":"/api/notes/tea"}]},"followedRelation":"note","nextTarget":"/api/notes/tea","completeRestConformanceClaim":false}
  1. JSON endpoint ve link, bütün sistemi RESTful olarak kanıtlar.
  2. Client sonraki target’ı keşfeder; tam REST uyumu kanıtlanmaz.
Gerekçeli cevabı oku

Client sonraki target’ı keşfeder; tam REST uyumu kanıtlanmaz. — followedRelation=note ve nextTarget açıkça verilmiştir. Örnek bütün architecture constraint’lerini ölçmez.

REST stateless constraint neden server resource state’inin veya database’in yasak olduğu anlamına gelmez?

Gerekçeli cevabı oku

Server resource state tutabilir. Stateless constraint, bir request’i yorumlamak için server’da saklanan önceki client session context’ine ihtiyaç duyulmamasını ister. Client gerekli context’i request’te taşımalıdır. Bu örnekte database çalıştırılmaz; stateless kavramından storage’sız architecture veya her GET’in public olduğu sonucu çıkarılmaz.

□ Resource state ile session context’i ayırdım.

□ Stateless olmayı erişim izni saymadım.

Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç

Kaynaklar ve kapsam

  • Roy Fielding — Dissertation Chapter 5: REST5.1.2 Client-Server · 5.1.3 Stateless · 5.1.4 Cache · 5.1.5 Uniform Interface · 5.1.6 Layered System · 5.1.7 Code-On-Demand · 5.2.1.1 Resources and Resource Identifiers · 5.2.1.2 Representations · 5.2.2 Connectors
  • RFC 9110 — HTTP Semantics3.1 Resources · 3.2 Representations · 8.3 Content-Type · 8.6 Content-Length · 9.2.1 Safe Methods · 9.2.2 Idempotent Methods · 9.3.1 GET · 9.3.2 HEAD · 12.5.1 Accept · 15.5.5 404 Not Found · 15.5.6 405 Method Not Allowed · 15.5.7 406 Not Acceptable
  • Node.js v24.13.0 — HTTP APIhttp.createServer([options][, requestListener]) · response.end([data[, encoding]][, callback]) · response.writableEnded · response.writableFinished