WEB / WEB-07.02
Methods, semantics ve status codes
Method niyeti, status server’ın o request için bildirdiği sonucu taşır. Safe, idempotent, authorized ve completed kavramlarını aynı etiket sanmadan izle.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Idempotent PUT tekrarı
- Desired state
Duru mevcut note label’ını Pinned yapmak ister; permission’ın true olduğu bu örnekte verilmiştir.
- Browser / Duru
- PUT: label=Pinned hazır; response bekleniyor
- Atlas Application
- Request yok
- Resource / yerel state
- Label: Draft
- İlk PUT ulaştı
Aynı target’a replacement request alındı; henüz commit yok.
- Browser / Duru
- PUT: label=Pinned hazır; response bekleniyor
- Atlas Application
- PUT alındı; policy kontrolü
- Resource / yerel state
- Label: Draft
- İlk replacement
Allowed action mevcut state’i Pinned ile değiştirir.
- Browser / Duru
- Response bekleniyor
- Atlas Application
- Fulfilled; 204 hazır
- Resource / yerel state
- Label: Pinned
- 204 ulaştı
Content ve Content-Length olmadan success; JSON parse yok.
- Browser / Duru
- 204 alındı; content yok
- Atlas Application
- Fulfilled; 204 hazır
- Resource / yerel state
- Label: Pinned
- Aynı request’i seç
Öğretim örneği aynı target ve content’i tekrar seçer; loss/retry ölçümü değildir.
- Browser / Duru
- Aynı PUT hazır; response bekleniyor
- Atlas Application
- Fulfilled; 204 hazır
- Resource / yerel state
- Label: Pinned
- Tekrar PUT ulaştı
Yeni request aynı intended replacement’i taşır.
- Browser / Duru
- Aynı PUT hazır; response bekleniyor
- Atlas Application
- Tekrar PUT alındı
- Resource / yerel state
- Label: Pinned
- State aynı kalır
İkinci fulfilled replacement sonrası Pinned; audit sayısı idempotence ölçütü değildir.
- Browser / Duru
- Response bekleniyor
- Atlas Application
- Tekrar fulfilled; 204 hazır
- Resource / yerel state
- Label: Pinned
- İkinci 204 ulaştı
Bu fixture aynı 204 seçer; standardın zorunlu response-equality kuralı değildir.
- Browser / Duru
- 204 alındı; intended state aynı
- Atlas Application
- Tekrar fulfilled; 204 hazır
- Resource / yerel state
- Label: Pinned
HEAD metadata, sıfır content
- HEAD intent’i
Representation metadata istenir, GET content transfer’i istenmez.
- Browser / Duru
- HEAD hazır; response bekleniyor
- Atlas Application
- Request yok
- Resource / yerel state
- Atlas note: GET 10 byte
- HEAD ulaştı
Server request method’ünü body kuralları için korur.
- Browser / Duru
- HEAD hazır; response bekleniyor
- Atlas Application
- HEAD alındı
- Resource / yerel state
- Atlas note: GET 10 byte
- Metadata hazır
200 ile Content-Length: 10, GET olsaydı dönecek content’i anlatır. HEAD response’unda content boyutu sıfırdır.
- Browser / Duru
- Response bekleniyor
- Atlas Application
- 200; CL=10; content=0
- Resource / yerel state
- Atlas note: GET 10 byte
- HEAD response ulaştı
Browser request bağlamıyla body’nin yokluğunu anlar.
- Browser / Duru
- 200; metadata 10; content 0
- Atlas Application
- 200; CL=10; content=0
- Resource / yerel state
- Atlas note: GET 10 byte
- Metadata’yı kullan
Representation bytes’i alınmadı; bu response JSON document değildir.
- Browser / Duru
- Metadata biliniyor; body alınmadı
- Atlas Application
- 200; CL=10; content=0
- Resource / yerel state
- Atlas note: GET 10 byte
Concealed 404
- GET intent’i
Public view notu ister; internal existence Browser’a verilmez.
- Browser / Duru
- GET hazır; existence unknown; response bekleniyor
- Atlas Application
- Request yok
- Resource / yerel state
- Exists=true; disclosure=false
- GET ulaştı
Application target’ı aldı; response kararını henüz vermedi.
- Browser / Duru
- GET hazır; existence unknown; response bekleniyor
- Atlas Application
- GET alındı
- Resource / yerel state
- Exists=true; disclosure=false
- Disclosure policy
Fixture policy varlığı gizler; missing branch ile aynı public body seçilir.
- Browser / Duru
- Response bekleniyor
- Atlas Application
- 404 hazır: Not found
- Resource / yerel state
- Exists=true; disclosure=false
- 404 ulaştı
Fetch outcome fixture Response ile resolve olur; ok=false.
- Browser / Duru
- 404; ok=false; existence unknown
- Atlas Application
- 404 hazır: Not found
- Resource / yerel state
- Exists=true; disclosure=false
- Kanıt sınırını koru
Browser yalnız public sonucu bilir; gerçek yokluk veya kalıcılık çıkarımı yapamaz.
- Browser / Duru
- Public result biliniyor; existence unknown
- Atlas Application
- 404 hazır: Not found
- Resource / yerel state
- Exists=true; disclosure=false
ROLLER · STATE · VERİ AKIŞI
Method resource’a yöneltilen bir niyettir
GET mevcut representation’ı istemek, HEAD aynı retrieval’ın content taşımayan metadata görünümünü istemektir. POST target’ın kendi semantics’ine göre content’i işlemesini ister. PUT bilinen target state’ini gönderilen representation ile create/replace etmeyi ister. DELETE target ile mevcut functionality ilişkisinin kaldırılmasını ister; bütün backup bytes’ının fiziksel silindiği garantisi değildir.
PATCH bir replacement representation yerine resource’a uygulanacak değişiklik instructions’ı taşır; patch document’in media format’ı ve endpoint contract’ı belirleyicidir. PATCH genel olarak safe veya idempotent sayılmaz, ancak belirli bir operation idempotent tasarlanabilir. HTTP method adı, otomatik retry garantisi için tek başına yeterli değildir.
OPTIONS communication seçeneklerini anlatır. CONNECT tunnel kurar; TRACE message loop-back içindir. Bir HTTP method’ünün standartta bulunması Browser Fetch üzerinden kullanılabileceğini göstermez: Fetch CONNECT ve TRACE gibi forbidden methods’ı kısıtlar. GET/HEAD request’ine non-null body verilmesi de Fetch Request constructor’da TypeError oluşturur; protocol’daki genel framing olasılığı ile Browser API sözleşmesi ayrı konudur.
Atlas’ın /notes/atlas-1 resource’u GET, HEAD ve PUT destekler. Bu örnekte permissionAllows=true başlangıç koşuludur. Target’ın desteklediği method’lar ile kullanıcının izinleri aynı set değildir. Bilinen bir method target’ta desteklenmiyorsa 405 ve Allow önemlidir; server’ın method’ü tanımaması veya implement etmemesi ise 501 bağlamıdır.
Safe ve idempotent farklı sorulara cevap verir
Safe, method’ün tanımlanmış niyetinin read-only olmasıdır. GET, HEAD, OPTIONS ve TRACE safe’tir. Server yine access log yazabilir; incidental side effect safe tanımını tek başına bozmaz. Ancak resource sahibi safe method ile business state değişikliği isteyen action’ı çalıştırmamalıdır: automated retrieval ve prefetch de bu method’leri kullanır.
Idempotent, aynı request tekrarlandığında intended server effect’in tek request ile aynı olmasıdır. PUT ve DELETE, safe method’lerle birlikte idempotent’tir; POST genel olarak böyle garanti vermez. Birinci PUT 204, sonraki PUT başka uygun status dönebilir; response byte’larının eşit olması gerekmez. Audit entries veya revision history tekrar başına artabilir.
Fixture aynı target’a label=Pinned state’ini iki kez PUT eder. Resource iki completion sonunda da Pinned’dir; repetition resource’u üçüncü bir state’e taşımaz. Diğer kullanıcıların eşzamanlı değişiklik yapmadığı burada açık varsayımdır. Gerçek update’lerde conditional requests ve concurrency policy ayrıca gerekir. Idempotence permission kontrolünü kaldırmaz; safe de confidential data’nın herkese açılabileceği anlamına gelmez.
Status sınıfları: sonuç var, bütün gerçekler yok
1xx interim information, 2xx successful processing, 3xx redirection veya related additional action, 4xx perceived client error, 5xx server error sınıflarıdır. Numeric status method ve headers ile okunur. 201 creation bildirir; 202 accepted processing’in tamamlandığını vaat etmez. 204 fulfilled request’i ek content olmadan bildirir.
401 geçerli authentication credentials eksikliğini bildirir ve applicable WWW-Authenticate challenge gerektirir. 403 request anlaşılmış olsa da fulfillment reddedildiğini gösterir; sebep yalnız credential olmayabilir. 404 mevcut representation bulunmadığını veya varlığın açıklanmak istenmediğini gösterebilir. Ayrıca temporary/permanent ayrımını tek başına vermez. Internal exists=true ve exists=false fixture’ları aynı 404 body’si verir; response bu farkı açmaz.
405 target method support’u, 409 mevcut resource state ile conflict’i, 415 kabul edilmeyen request format’ını açıklayabilir. 422 anlaşılan content type ve doğru syntax içindeki işlenemeyen instructions için kullanılır. Bu status’ların application mapping’i belgelenmelidir; error response görmek tek başına saldırı veya server defect kanıtı değildir.
Body kuralları ve Browser sonucu
HEAD response’u content taşıyamaz. Örnekte Content-Length: 10 gönderilir: GET olsaydı aynı representation’ın 10 byte olacağını söyler; HEAD’de beklenen body 0 byte’tır. Böyle bir field HEAD için kullanılacaksa would-be GET content uzunluğuyla eşleşmelidir. 204 ise content/trailers içeremez ve server Content-Length gönderemez; Content-Length: 0 ekleyerek body kuralını açıklamak doğru değildir.
Fetch HTTP error status için normalde reject olmaz: 404 response ulaşırsa Promise bir Response ile resolve olur. Response.ok yalnız 200–299 status aralığını ifade eder; 202’de business job hâlâ pending olabilir. Network error/abort gibi durumlar ayrı failure yoludur. Response body’sini JSON parse etmek de status’tan ayrı işlemdir; HEAD/204 için olmayan content’i parse etmeye çalışma.
İdempotent request için response gelmeden connection failure olduğunda repeat semantics yararlıdır; ilk işlem uygulanmış olabilir. Non-idempotent bir action’ı yalnız “yanıt alamadım” diye otomatik tekrar etmek genel garantiye dayanmaz. İlgili action’ın özel idempotency veya status-reconciliation sözleşmesi varsa o sözleşme ayrıca değerlendirilir.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
Safe / rights
- Method özelliği permission değildir
GET safe/idempotent olsa da confidential note’nin okunması resource permission ister. Artifact permissionAllows=true sadece verilmiş predicate’tir; safe etiketi user entitlement üretmez.
- Method/status evidence
- GET safe / permission separate
- Intent/completion gate
- Business gate yok
- Business outcome
- Outcome yok
- Status completion’a yükseltilmedi
Safe intent requested state mutation değildir. Log veya incidental processing olabilir; permission kontrolünü yalnız write methods’a koymak protected read gate’ini boş bırakır.
- Method/status evidence
- GET safe / permission separate
- Intent/completion gate
- Read entitlement required
- Business outcome
- Outcome yok
- Retry için operation contract gerekli
PUT desiredState label=Pinned iki attempt’te aynı intended state effect’i verir. Genel POST veya PATCH’e aynı property aktarılmaz; application operation daha dar idempotent tasarlanabilir.
- Method/status evidence
- GET safe / permission separate
- Intent/completion gate
- Read entitlement required
- Business outcome
- PUT desired state / POST guarantee absent
- 404 public eşitliği korur
privacy404 örneği, internalExists true ve false olduğunda aynı 404 ve Not found sonucunu verir. Bu public status’tan resource’un varlığını çıkarmak, concealed resource policy’sini yanlış yorumlamak olur.
- Method/status evidence
- 404 / existence unknown
- Intent/completion gate
- Read entitlement required
- Business outcome
- PUT desired state / POST guarantee absent
- Body kuralları completion’dan ayrı
HEAD 200 wouldBeGetOctets=10 taşıyabilir ama actualContentOctets=0’dır. PUT 204 responseContent=null’dur; 204 empty JSON object gibi parse edilecek content üretmez.
- Method/status evidence
- 404 / existence unknown
- Intent/completion gate
- HEAD no content / 204 no content
- Business outcome
- PUT desired state / POST guarantee absent
- Failure ve intent sınıfları korundu
Network-error rejected Promise server effect’i unknown bırakır. Method/status/operation contract ayrı açıklanır; malformed request, external retry veya live mutation bu sınıflandırmadan üretilmez.
- Method/status evidence
- 404 / existence unknown
- Intent/completion gate
- HEAD no content / 204 no content
- Business outcome
- Method semantics / business unknown
202 completion
- 202 HTTP sonucu seçildi
fetchOutcomes[0] bir 202 Response ile resolve olur ve ok=true’dur. Bu status request’in processing için kabul edildiğini anlatır; businessCompleted=false aynı row’da ayrı alandır. HTTP başarı aralığı ile job completion farklı sorulardır.
- Method/status evidence
- 202; resolved-response; ok true
- Intent/completion gate
- Completion henüz değerlendirilmedi
- Business outcome
- BusinessCompleted false
- Accepted sonucu completed yapılmaz
BusinessCompleted=false olan bu örnekte UI “iş tamamlandı” sonucunu gösteremez. Response.ok yalnız 200–299 aralığını test eder. Bir işin completion sonucunu öğrenmek için o operation’ın contract’ına bağlı application state gerekir.
- Method/status evidence
- 202; resolved-response; ok true
- Intent/completion gate
- Accepted; completion yok
- Business outcome
- BusinessCompleted false
- Action effect’i kendi contract’ına bağlıdır
Ayrı PUT karşılaştırması Draft→Pinned ve Pinned→Pinned intended effect’ini gösterir. Bu method özelliği, 202 veren başka bir action’ın tamamlandığını veya genel POST/PATCH’in tekrar garantisini oluşturmaz. Bu row’lar aynı işlem gibi birleştirilmez.
- Method/status evidence
- Ayrı karşılaştırma: PUT replacement
- Intent/completion gate
- 202 hâlâ accepted; completion yok
- Business outcome
- BusinessCompleted false
- HTTP404 ile network rejection ayrıdır
fetchOutcomes[1] 404 Response ile resolve olur ve ok=false’dur. fetchOutcomes[2] ise response status bilinmeden network-error rejection verir; server effect bilinmez. Bu iki negative outcome, 202’nin application state’ini değiştiren yeni olaylar değildir.
- Method/status evidence
- 404 Response / network rejection ayrı
- Intent/completion gate
- 202 accepted; ayrı outcome row’ları
- Business outcome
- 202 business false; network effect unknown
- Yeni retry kararı genel varsayımdan çıkmaz
Response alınmayan bir işlem uygulanmış olabilir. Tekrar kararı method’ün intended effect’i ve operation contract’ıyla değerlendirilir; 202 veya rejected Promise tek başına “hiç çalışmadı” demek değildir. Burada yeni request veya action yürütülmez.
- Method/status evidence
- 202/404/network row’ları ayrı tutulur
- Intent/completion gate
- Completion ve retry contract gerektirir
- Business outcome
- 202 business false; network effect unknown
- Application üreticisi completion’ı açıklar
HTTP endpoint ve Fetch outcome status/Promise sonucunu verir. Job veya resource state’ini yöneten application üreticisi completion sonucunu verir; aynı operation’la eşleşen bu kanıt eksikse tamamlanma bilinmez. Verilmiş 202 row’unda businessCompleted=false korunur.
- Method/status evidence
- HTTP status ve Promise ayrı sınıflanır
- Intent/completion gate
- Üretici application state; coverage gerekir
- Business outcome
- 202 accepted; business tamamlanmadı
VARSAYIM · SINIR · KONTROL
Read-only etiketi erişim izni değildir
Confidential bir note GET ile okunur. Safe olmasının anlamı client’ın state mutation istememesidir; note’nin sensitive olup olmadığını veya Duru’ya ait olup olmadığını açıklamaz. Yetki kontrolünü yalnız write methods’a koyan tasarım protected read boundary’sini eksik bırakır.
Blocking control her resource/action için trusted permission kararını almak ve safe route’larda requested mutation çalıştırmamaktır. Fixture’ın supplied permissionAllows=true değeri gerçek identity verification veya authorization engine kanıtı değildir. Bu ders harmless note metadata’sı kullanır.
Retry ve status yanlış kabul kapısına dönüşmesin
Normal PUT replacement aynı desired state’e gider. Yanlış varsayım bütün POST’ların aynı garantiyi verdiğini veya 202’nin işi bitirdiğini sanmaktır. Etki duplicate business action ya da henüz tamamlanmayan işi tamamlandı diye göstermek olabilir; scope application semantics’ine bağlıdır.
Client kontrolü method’e, operation contract’a ve completion evidence’a dayanır. Server generic 404 kullanıyorsa client resource absence’ı iddia etmez. Savunma incelemesi internal decision reason ile public result’ı ayırır; gizlenen existence public body’ye yazılarak privacy policy bozulmamalıdır.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
PUT state effect
- Method context önce seçildi
Fixture, /notes/atlas-1 için permission’ı verilmiş ve concurrent writer olmadığını kabul eder. GET, HEAD ve PUT yine farklı method/content sözleşmeleriyle okunur. Bu varsayımlar gerçek authorization veya concurrency testi değildir.
- Operation evidence
- Method + resource context
- Effect/content review
- Effect/bytes review yok
- Status-contract review
- Verdict yok
- State effect veya metadata hesaplandı
İlk PUT denemesi Draft state’ini Pinned yapar; ikinci deneme Pinned state’ini korur. İdempotence, response metinlerinin eşitliğinden değil, işlemin amaçlanan state etkisinden değerlendirilir.
- Operation evidence
- Method + resource context
- Effect/content review
- Draft→Pinned / Pinned→Pinned
- Status-contract review
- Verdict yok
- 204 content yokluğu kaydedildi
Her PUT denemesi 204 döndürür; responseContent ve responseContentLengthField null kalır. No-content status için JSON body teslim edilmiş gibi observation eklenmez.
- Operation evidence
- 204 / content null
- Effect/content review
- Draft→Pinned / Pinned→Pinned
- Status-contract review
- Verdict yok
- İkinci replacement ilk sonucu korur
İki attempt aynı resource ve label=Pinned representation’ına bağlıdır; concurrentWriters=false verilmiştir. İkinci intended effect yine Pinned’dir. Audit sayısı veya status metni bu state comparison’ın yerine geçirilmez.
- Operation evidence
- 204 / content null
- Effect/content review
- Draft→Pinned / Pinned→Pinned
- Status-contract review
- Verdict yok
- State sonucu application’dan gelir
Gerçek incelemede resource state’ini değiştiren application katmanı before/after sonucunun üreticisidir. Client’ın 204 receipt’i fulfillment bildirir, fakat state history veya persistence durability’yi tek başına ölçmez. Aynı target ve representation’la eşleşen state kanıtı gerekir.
- Operation evidence
- 204 / content null
- Effect/content review
- Draft→Pinned / Pinned→Pinned
- Status-contract review
- Üretici application state; persistence kapsam dışı
- Semantic regression intended scope’ta
Tekrarlanan PUT aynı Pinned etkisini korur ve iki 204 response da content taşımaz. Bu iki deneme, concurrent writer davranışını veya bütün business persistence sürecini doğrulamaz.
- Operation evidence
- 204 / content null
- Effect/content review
- Draft→Pinned / Pinned→Pinned
- Status-contract review
- PUT effect consistent / concurrent scope omitted
HEAD metadata
- HEAD aynı resource için seçildi
HEAD /notes/atlas-1, GET’in content’ini taşımadan representation metadata’sını ister. Örnekte wouldBeGetBody=Atlas note ve wouldBeGetOctets=10’dur; permission verilmiş koşuldur, gerçek account kararı değildir.
- Operation evidence
- HEAD /notes/atlas-1; GET 10 byte
- Effect/content review
- Metadata ve actual bytes ayrı
- Status-contract review
- Coverage henüz incelenmedi
- State effect veya metadata hesaplandı
HEAD için status 200, contentLengthField 10 ve actualContentOctets 0 olur. Metadata, karşılık gelen GET representation’ını anlatabilir; 10 byte content teslim edildiği anlamına gelmez.
- Operation evidence
- HEAD /notes/atlas-1; GET 10 byte
- Effect/content review
- HEAD metadata10 / actual0
- Status-contract review
- Verdict yok
- HEAD metadata byte receipt değildir
contentLengthField=10 would-be GET uzunluğunu anlatır; actualContentOctets=0 ise HEAD’de content taşınmadığını belirtir. HEAD 200 ile PUT 204 ayrı method/status bağlamlarıdır; 204’ün null content field’ı HEAD row’una kopyalanmaz.
- Operation evidence
- HEAD /notes/atlas-1; GET 10 byte
- Effect/content review
- HEAD 200; CL 10; actual content 0
- Status-contract review
- HEAD body yok; metadata var
- Negative fixture coverage’dan ayrıldı
HEAD actualContentOctets>0 predicate’i verilmiş inconsistent row’u işaretler. Eksik row nedeniyle zero match gerçek body kuralının geçerli ölçüldüğünü söylemez.
- Operation evidence
- HEAD /notes/atlas-1; GET 10 byte
- Effect/content review
- HEAD predicate / coverage separate
- Status-contract review
- HEAD body yok; metadata var
- Method context ve capture scope gerekir
Gerçekte server HTTP üreticisi method/status ve would-be GET metadata’sını, client veya kapsamı bilinen capture actual body receipt’ini açıklar. HEAD context’i kaybolursa Content-Length yanlışlıkla teslim edilmiş byte sayısı sanılabilir. Zero selector match eksik kayıt coverage’ını tamamlamaz.
- Operation evidence
- HEAD /notes/atlas-1; GET 10 byte
- Effect/content review
- HEAD metadata / capture completeness ayrı
- Status-contract review
- Üretici server + client/capture; coverage gerekir
- Semantic regression intended scope’ta
HEAD metadata/body ayrımı verilmiş case’te tutarlıdır. Full capture completeness ve gerçek client/server instrumentation ayrıca gerekir.
- Operation evidence
- HEAD /notes/atlas-1; GET 10 byte
- Effect/content review
- HEAD metadata / capture completeness ayrı
- Status-contract review
- HEAD metadata consistent / capture unproven
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Method, status ve gerçek state değişimini eşle
İdempotence kontrolünde response metninin eşitliğini değil intended state effect’i karşılaştır. Artifact two PUT completions için before/after label tutar. HEAD observation’da wouldBeGetOctets=10 ile actualContentOctets=0 ayrı alanlardır. Bunlar öğretim karar kayıtlarıdır, access log standardı değildir.
XPath, method=HEAD observation’ında actualContentOctets>0 olan tutarsız fixture’ı seçer. Negative 0, positive 1 beklenir; eksik observation 0 döndürse bile body kuralının doğrulandığı söylenemez. Gerçek traffic için capture completeness ve instrumented server/client context gerekir.
Status catalog’u ürün sözleşmesiyle tamamla
Manual exercise’de PUT tekrarının label sonucunu, HEAD metadata’sını ve 404 public equivalence’ını karşılaştır. 202’yi “tamamlandı”, 404’ü “kesin yok”, 204’ü “JSON boş object” diye çevirme. İşlem sonucu ve user-facing mesaj uygulamanın belgeli contract’ına bağlansın.
405 için Allow alanını target support kanıtı olarak oku; kullanıcı permission listesi sanma. 401 challenge, 403 refusal ve concealed 404 farklı operational kararları temsil edebilir. Gözlenen status distribution tanı koymak için tek başına yeterli değildir; normal client validation ve transient service failures da aynı sınıfları üretir.
ŞİMDİ VAKAYA UYGULA
Method property ile business completion hangi farklı kanıtları ister?
Atlas note okunurken permission gerekir; safe GET etiketi bunu sağlamaz. Tekrarlanan PUT, Pinned state’ini korur. 202 işin tamamlandığını söylemez; HEAD metadata’sı da teslim edilmiş content değildir.
Vakadaki 200, media type ve parse error kayıtlarını ayrı değerlendir. Bu dersteki representation kurallarıyla usable data için henüz hangi koşulun gerektiğini açıkla.
Bağlı vaka dosyasını aç ↗ÖRNEĞİ BİRLİKTE OKUYALIM
Method karar defteri: PUT, HEAD ve concealed 404
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"resource": "/notes/atlas-1",
"permissionAllows": true,
"concurrentWriters": false,
"methods": [
{
"method": "GET",
"safe": true,
"idempotent": true
},
{
"method": "HEAD",
"safe": true,
"idempotent": true
},
{
"method": "POST",
"safe": false,
"idempotent": false
},
{
"method": "PUT",
"safe": false,
"idempotent": true
},
{
"method": "DELETE",
"safe": false,
"idempotent": true
},
{
"method": "PATCH",
"safe": false,
"idempotent": false,
"scope": "General method property; particular PATCH operations can be designed to be idempotent."
},
{
"method": "OPTIONS",
"safe": true,
"idempotent": true
},
{
"method": "TRACE",
"safe": true,
"idempotent": true
},
{
"method": "CONNECT",
"safe": false,
"idempotent": false
}
],
"put": {
"desiredState": {
"label": "Pinned"
},
"attempts": [
{
"before": "Draft",
"after": "Pinned",
"status": 204,
"responseContent": null,
"responseContentLengthField": null
},
{
"before": "Pinned",
"after": "Pinned",
"status": 204,
"responseContent": null,
"responseContentLengthField": null
}
]
},
"head": {
"method": "HEAD",
"status": 200,
"contentType": "text/plain; charset=utf-8",
"contentLengthField": 10,
"wouldBeGetBody": "Atlas note",
"wouldBeGetOctets": 10,
"actualContentOctets": 0
},
"privacy404": [
{
"internalExists": true,
"internalDisclosureAllowed": false,
"status": 404,
"publicBody": "Not found"
},
{
"internalExists": false,
"internalDisclosureAllowed": false,
"status": 404,
"publicBody": "Not found"
}
],
"fetchOutcomes": [
{
"status": 202,
"promiseOutcome": "resolved-response",
"ok": true,
"businessCompleted": false
},
{
"status": 404,
"promiseOutcome": "resolved-response",
"ok": false,
"existenceConclusion": "unknown"
},
{
"status": null,
"promiseOutcome": "rejected-network-error",
"ok": null,
"serverEffectConclusion": "unknown"
}
],
"selector": {
"language": "XPath",
"xml": "<observations><response method=\"HEAD\" actualContentOctets=\"0\"/></observations>",
"xpath": "count(/observations/response[@method=\"HEAD\" and number(@actualContentOctets)>0])",
"expected": 0,
"positiveFixtureXml": "<observations><response method=\"HEAD\" actualContentOctets=\"1\"/></observations>",
"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."
}
}- methods.safe / idempotent
- Standart method intent’i; permission, encryption veya bütün API implementasyonları hakkında garanti değil.
- put.attempts
- İki replacement sonrası intended state; eşzamanlı writer yok.
- head.contentLengthField
- HEAD’de gelen content boyutu değil, would-be GET metadata’sı.
- privacy404
- Farklı internal state’in aynı public status/body’ye eşlenmesi.
- fetchOutcomes
- HTTP outcome, Promise outcome ve business completion ayrı gözlem.
Bütün izinler supplied; replacement in-process. Fetch sonuçları source-grounded fixture’dır, Browser/network çalıştırması değildir. Generic body eşitliği timing veya tam privacy guarantee ölçmez.
İki yanlış kanı
Idempotent request her tekrarda aynı response’u üretir.
Aynı intended server effect gerekir; status veya audit/revision side effects farklı olabilir. Permission yine kontrol edilir.
404 kesin yok demektir; Fetch de error olduğu için reject olur.
404 varlığın gizlenmesini de gösterebilir ve genelde Response ile resolve olur. Response.ok false’tur; network error ayrı yoldur.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
Aynı PUT iki kez Pinned state’ini kuruyor; ikisi de 204 döndürüyor. Idempotent olmak response byte’larının aynı olması mı?
- Hayır. Tekrarın amaçlanan server effect’i aynıdır.
- Evet. Idempotent method bütün response alanlarını sabitler.
Gerekçeli cevabı oku
Hayır. Tekrarın amaçlanan server effect’i aynıdır. — Örnek Draft→Pinned ve Pinned→Pinned geçişlerini gösterir. Idempotence response eşitliği garantisi değildir.
HEAD için Content-Length=10, fakat actualContentOctets=0. Çelişki var mı?
Dersten seçilen artifact alanları; öğretim örneği
- head
- {"method":"HEAD","status":200,"contentType":"text/plain; charset=utf-8","contentLengthField":10,"wouldBeGetBody":"Atlas note","wouldBeGetOctets":10,"actualContentOctets":0}
- Evet. HEAD body mutlaka 10 octet taşımalıdır.
- Hayır. HEAD content taşımaz; uzunluk GET metadata’sıdır.
Gerekçeli cevabı oku
Hayır. HEAD content taşımaz; uzunluk GET metadata’sıdır. — wouldBeGetOctets=10 metadata’dır. actualContentOctets=0, HEAD semantics ile uyumludur.
202 ve public 404, business completion ve internal existence hakkında ne söyler?
Gerekçeli cevabı oku
202 request’in kabul edildiğini gösterebilir, fakat businessCompleted=false kalabilir. Bu örnekte public 404 hem bulunmayan hem varlığı paylaşılmayan resource için kullanılır; içerideki varlık durumu bilinmez. İki status da alınmış HTTP Response’tur. 404 tek başına fetch rejection değildir.
□ 202’yi business completion saymadım.
□ 404’ten kesin internal yokluk sonucu çıkarmadım.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- RFC 9110 — HTTP Semantics9.1 Overview · 9.2.1 Safe Methods · 9.2.2 Idempotent Methods · 9.3.2 HEAD · 9.3.3 POST · 9.3.4 PUT · 9.3.5 DELETE · 8.6 Content-Length · 15 Status Codes · 15.3.3 202 Accepted · 15.3.5 204 No Content · 15.5.2 401 Unauthorized · 15.5.4 403 Forbidden · 15.5.5 404 Not Found · 15.5.6 405 Method Not Allowed · 15.5.16 415 Unsupported Media Type · 15.5.21 422 Unprocessable Content
- RFC 9112 — HTTP/1.16.3 Message Body Length
- WHATWG — Fetch Standard (official source)Methods: safe and CORS-safelisted methods · Request constructor: GET/HEAD non-null body throws TypeError · Response.ok getter: ok status · Fetch methods: processResponse network error rejects promise
- MDN — Window: fetch() methodWindow: fetch() method · Return value
- RFC 5789 — PATCH Method for HTTP2 The PATCH Method