İçeriğe geç
XDD.baby Yazılım Öğrenme
Sözlük Hata rehberi 0/56

Blok 3 · Ders 18

Web nasıl çalışır?

Tarayıcı, sunucu, URL, HTTP ve HTML/CSS/JavaScript üçlüsü; geliştirici araçlarıyla bir sitenin içine bakıyorsun.

Bu dersin sonunda

  • Adres çubuğuna bir adres yazınca istemci ile sunucu arasında olanları sırasıyla anlatabilirsin
  • Bir URL'yi protokol, alan adı, port, yol, sorgu ve parça olarak ayırabilirsin
  • nslookup ile bir alan adının IP adresini bulabilir, DNS hatasını tanıyabilirsin
  • HTML, CSS ve JavaScript'in görevlerini ayırt edip ilk web sayfanı yazabilirsin
  • Sayfanı Live Server ya da npx serve ile kendi bilgisayarındaki bir sunucudan açabilirsin
  • Geliştirici araçlarının Elements, Console ve Network sekmeleriyle bir sayfanın içine bakabilirsin
Bu sayfada
  1. İstemci ve sunucu
  2. Adres yazınca neler olur?
  3. URL'nin parçaları
  4. DNS: alan adından IP adresine
  5. HTTP: istek ve yanıta ilk bakış
  6. Sayfanın üç dili: HTML, CSS, JavaScript
  7. İlk HTML dosyan
  8. Görünüm ve davranış ekle
  9. Neden yerel sunucu?
  10. Live Server ile aç
  11. Alternatif: npx serve
  12. Geliştirici araçları: sayfanın içine bak
  13. Sık hatalar
  14. Görevler
  15. Kendini sına
  16. Kayıt noktası

Şimdiye kadar yazdığın bütün programlar terminalde çalıştı. Bu blokla sahne değişiyor: tarayıcıda açılan sayfalar yapacaksın. Önce adres çubuğuna bir adres yazıp Enter'a basınca perde arkasında olanları öğreneceksin. Dersin sonunda ilk web sayfanı (C:\kod\web-ilk) yazmış, kendi bilgisayarındaki bir sunucudan açmış ve geliştirici araçlarıyla içine bakmış olacaksın.

İstemci ve sunucu

Bir web sayfası senin bilgisayarında değil, başka bir bilgisayarda durur: çoğu zaman bir veri merkezinde gece gündüz açık bekleyen bir makinede. Adresi yazınca tarayıcın o makineye "bu sayfayı bana ver" der, makine de sayfayı gönderir. Konuşmanın iki tarafı var: isteyen ve veren.

İstemci tarayıcın lokantada: garson Sunucu başka bir bilgisayar lokantada: mutfak İstek: “ders18 sayfasını ver” internet üzerinden Yanıt: işte sayfanın HTML'i sipariş fişi = istek · gelen tabak = yanıt
Şekil 18.1 Web bir konuşmadır: istemci ister, sunucu verir.

"Sunucu" kulağa özel bir donanım gibi gelse de sıradan bir programdır: bu derste kendi bilgisayarında birini çalıştıracak, Ders 27'de de kendin yazacaksın.

Adres yazınca neler olur?

Adres çubuğuna xdd.baby/ders18 yazıp Enter'a bastığında, sayfa ekrana gelmeden önce beş şey sırayla olur. Hepsi çoğu zaman bir saniyeden kısa sürer.

1 Adı numaraya çevir (DNS) alan adının IP adresi bulunur xdd.baby → 76.76.21.21 2 Bağlan o IP adresine bağlantı açılır 76.76.21.21:443 3 İstek gönder tarayıcı ne istediğini yazar GET /ders18 4 Yanıtı al durum kodu ve HTML gelir 200 OK · HTML 5 Sayfayı çiz CSS, JS, resim için yeni istekler ders.css, ders.js…
Şekil 18.2 Bir adresin yolculuğu: beş adım.
  1. Adı numaraya çevir. Bilgisayarlar birbirini adla değil numarayla bulur; tarayıcı önce xdd.baby'nin numarasını, yani IP adresini öğrenir. Bu işin adı DNS.
  2. Bağlan. Tarayıcı o numaraya bir bağlantı açar. Adres https ile başlıyorsa bağlantı şifrelenir: aradaki kimse ne istediğini ve ne geldiğini okuyamaz. Şifresiz http sitelerde tarayıcı adres çubuğuna Güvenli değil (Not secure) yazar.
  3. İstek gönder. Tarayıcı ne istediğini yazar: "/ders18 sayfasını ver."
  4. Yanıtı al. Sunucu bir durum kodu (her şey yolundaysa 200) ve sayfanın HTML'ini gönderir.
  5. Çiz. Tarayıcı HTML'i okur; içinde bir stil dosyasının, JavaScript dosyasının ya da resmin adı geçtikçe her biri için yeni bir istek gönderir ve parçalar geldikçe sayfayı ekrana çizer.

Beşinci adım önemli: bir sayfa tek istek değildir. Bu sayfayı açarken tarayıcın stil dosyası, yazı tipleri ve küçük resimler için de istek gönderdi; hepsini geliştirici araçlarında göreceksin.

URL'nin parçaları

Adres çubuğuna yazdığın şeyin adı URL. Bir URL tek satırda hangi dille konuşulacağını, hangi bilgisayara gidileceğini ve orada hangi sayfanın istendiğini söyler. Parçalarını tanırsan adresleri de hata mesajlarını da rahat okursun.

Bir sitenin adresi https :// example.com /sampiyonlar/ahri ?dil=tr #yetenekler protokol yol parça sunucuya gitmez alan adı sorgu Kendi bilgisayarındaki sunucunun adresi http :// 127.0.0.1 :5500 /index.html protokol port yol IP adresi: bu bilgisayar Port: aynı bilgisayardaki sunucunun kapı numarası.
Şekil 18.3 URL'nin parçaları. Üstte bir sitenin, altta kendi bilgisayarında çalışan bir sunucunun adresi.
ParçaÖrnekteNe işe yarar?Sunucuya gider mi?
protokolhttpsHangi dille konuşulacağı; https, HTTP'nin şifreli hâli.evet
alan adıexample.comHangi bilgisayar; DNS ile numaraya çevrilir.evet
portyazılmamışO bilgisayarın hangi kapısı; https için 443 varsayılır.evet
yol/sampiyonlar/ahriOradaki hangi sayfa ya da dosya.evet
sorgu?dil=trEk bilgi: ad=değer çiftleri, aralarında &.evet
parça#yeteneklerSayfanın içindeki bir yer; tarayıcı oraya kaydırır.hayır

Son satıra dikkat: # ile başlayan parça sunucuya hiç gönderilmez, tarayıcıda kalır. Bu sayfada dene: "Bu sayfada" listesinden bir başlığa tıkla; adresin sonuna #url-nin-parcalari gibi bir parça eklenir, sayfa kayar ama yeniden yüklenmez.

JavaScript de adresleri parçalar

Ders 16'da kendi sınıflarını yazdın. JavaScript'in hazır sınıflarından biri URL: ona new ile bir adres verirsen adresi parçalarına ayırır. C:\kod\ogren klasöründe ders18.js dosyasını oluştur ve yaz:

ders18.js
const adres = new URL("https://example.com/sampiyonlar/ahri?dil=tr#yetenekler")console.log(adres.protocol)console.log(adres.hostname)console.log(adres.pathname)console.log(adres.search)console.log(adres.hash)
Çıktı
https:example.com/sampiyonlar/ahri?dil=tr#yetenekler

Her parça objenin bir alanı: protocol protokol (sonundaki iki nokta dahil), hostname alan adı, pathname yol, search sorgu, hash parça. Bütün alanları birden görmek için objenin kendisini yazdır:

ders18.js
const adres = new URL("https://example.com/sampiyonlar/ahri?dil=tr#yetenekler")console.log(adres)
Çıktı
URL {  href: 'https://example.com/sampiyonlar/ahri?dil=tr#yetenekler',  origin: 'https://example.com',  protocol: 'https:',  username: '',  password: '',  host: 'example.com',  hostname: 'example.com',  port: '',  pathname: '/sampiyonlar/ahri',  search: '?dil=tr',  searchParams: URLSearchParams { 'dil' => 'tr' },  hash: '#yetenekler'}

port: '' satırına bak: adreste port yazılmadığı için boş. Tanımadığın alanlara (origin, searchParams) şimdilik takılma. example.com tam da böyle örnekler için ayrılmış gerçek bir alan adıdır.

Sık hataTypeError: Invalid URL

Ne zaman çıkar? new URL'e adresi protokolsüz verince. Tarayıcının adres çubuğu xdd.baby yazmana izin verir, başına https://'yi kendisi ekler; JavaScript eklemez.

ders18.js
const adres = new URL("xdd.baby/ders18")
Hata çıktısı
node:internal/url:840      href = bindingUrl.parse(input, base, true);                        ^ TypeError: Invalid URL    at new URL (node:internal/url:840:25)    at Object.<anonymous> (C:\kod\ogren\ders18.js:1:15)    ...    at node:internal/main/run_main_module:33:47 {  code: 'ERR_INVALID_URL',  input: 'xdd.baby/ders18'} Node.js v24.20.0

Nasıl düzelir? Adresi tam yaz: new URL("https://xdd.baby/ders18"). Mesajın en üstünde senin dosyan değil Node'un kendi dosyası (node:internal/url) var, çünkü hata URL sınıfının içinde fırlatıldı; kendi satırını at satırlarında ders18.js'i arayarak bulursun. Alttaki input: satırı JavaScript'in beğenmediği metni gösterir.

DNS: alan adından IP adresine

İnternete bağlı her cihazın bir numarası var: IP adresi, yani 76.76.21.21 gibi noktalarla ayrılmış dört sayı. Bilgisayarlar birbirini bu numarayla bulur, insanlar ise ad hatırlar: xdd.baby. Ad ile numara arasındaki çeviriyi DNS yapar.

Tarayıcın xdd.baby önce kendi hafızasına bakar DNS sunucusu internetin telefon rehberi Site sunucusu 76.76.21.21 1. “xdd.baby” hangi numarada? 2. 76.76.21.21 3. 76.76.21.21'e bağlan Bir sonraki sefer 1 ve 2 atlanır: numara hafızadadır.
Şekil 18.4 Tarayıcı önce rehbere sorar, sonra numarayı arar.

nslookup: rehbere kendin sor

DNS'e terminalden de sorabilirsin. VS Code'un terminaline (ya da bir PowerShell penceresine) yaz:

Terminal — PowerShell
PS C:\kod> nslookup xdd.babyServer:  dns.googleAddress:  2001:4860:4860::8888 Non-authoritative answer:Name:    xdd.babyAddress:  76.76.21.21
  • Server ve altındaki Address: soruyu cevaplayan DNS sunucusu. Bu ders yazılırken Google'ın DNS'iydi; sende büyük ihtimalle modemin görünür (çoğu evde UnKnown ve 192.168.1.1).
  • Non-authoritative answer: "yetkili olmayan cevap", yani cevabı alan adının sahibi değil, hafızasında tutan aracı bir sunucu verdi. Normaldir.
  • Name ve en alttaki Address: aradığın cevap. xdd.baby'nin numarası 76.76.21.21.

Bu çıktı, Windows görüntüleme dili Türkçe olan bir bilgisayarda alındı; nslookup yine İngilizce yazdı. Windows'u baştan Türkçe kurulmuş bazı bilgisayarlarda satır adları Türkçe çıkabilir; ad ve numaralar aynı yerde durur. Birden çok numara varsa Addresses altında sıralanır.

Sık hataBu siteye ulaşılamıyor / This site can’t be reached

Ne zaman çıkar? Olmayan bir alan adına gidince, örneğin adı yanlış yazınca: DNS bir numara bulamaz, tarayıcının bağlanacağı bir yer kalmaz. Denemek için adres çubuğuna başıyla birlikte https://xdd.bbay yaz. Yalnız xdd.bbay yazarsan tarayıcı sonunu tanımadığı bu adı arama sanıp arama sonuçlarını açabilir.

xdd.bbay
Türkçe Chrome'un hata sayfası: Bu siteye ulaşılamıyor. Altında: xdd.bbay ana makinesinin sunucu IP adresi bulunamadı. Aşağıdakileri deneyin: bağlantınızı kontrol etme; proxy, güvenlik duvarı ve DNS yapılandırmasını kontrol etme; Windows Ağ Teşhislerini çalıştırma. En altta hata kodu ERR_NAME_NOT_RESOLVED ve Yeniden Yükle düğmesi.

İngilizce tarayıcıda başlık This site can’t be reached, altındaki satır xdd.bbay’s server IP address could not be found. olur. ERR_NAME_NOT_RESOLVED "ad çözülemedi" demek; Chrome bazen yerine DNS_PROBE_FINISHED_NXDOMAIN yazar, anlamı aynı. nslookup da aynısını söyler:

Terminal — PowerShell
PS C:\kod> nslookup xdd.bbayServer:  dns.googleAddress:  2001:4860:4860::8888 *** dns.google can't find xdd.bbay: Non-existent domain

Nasıl düzelir? Adres çubuğundaki adı harf harf oku. Ad doğruysa ve başka siteler de açılmıyorsa sorun internet bağlantında ya da DNS ayarlarındadır.

HTTP: istek ve yanıta ilk bakış

Bağlantı açıldıktan sonra tarayıcı ile sunucunun konuştuğu dilin adı HTTP. Ders 15'te fetch ile Data Dragon'a istek gönderdiğinde de bu dili kullandın. Tarayıcı her sayfa için aynı konuşmayı yapar; konuşma metindir ve okunabilir:

İstek tarayıcıdan sunucuya GET /ders18 HTTP/1.1 Host: xdd.baby Accept: text/html,… User-Agent: Mozilla/5.0 … ← metot, yol, sürüm ← hangi site ← ne bekliyorum ← hangi tarayıcı Yanıt sunucudan tarayıcıya HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Server: Vercel <!doctype html>… ← sürüm ve durum kodu ← içerik türü ← sunucu yazılımı ← boş satır: başlıklar bitti ← gövde: sayfanın kendisi
Şekil 18.5 Bir HTTP isteği ve yanıtı. Sağdaki notlar her satırın ne dediğini söylüyor.

İsteğin ilk satırı en önemlisi: GET /ders18. GET isteğin metodudur, yani türü: "bana ver" demektir; sayfa açmak da resim indirmek de GET'tir. (Sözcük aynı ama Ders 5'teki obje metotlarıyla ilgisi yok.)

Sondaki HTTP/1.1 konuşulan dilin sürümü. Altındaki satırlar başlıklardır (headers): Host hangi site (aynı IP adresinde birçok site durabilir), User-Agent hangi tarayıcı.

Yanıtın ilk satırında sürümden sonra durum kodu gelir; Ders 15'teki yanit.status buydu. En sık göreceklerin:

KodAnlamıNe zaman görürsün?
200tamam (OK)İstediğin geldi.
301kalıcı olarak taşındıAdres değişmiş; tarayıcı yeni adrese kendisi gider.
304değişmediDosya tarayıcının elindekiyle aynı; kendi kopyasını kullanır.
404bulunamadıYol yanlış ya da dosya yok.
500sunucu hatasıSunucudaki program hataya düştü.

Yanıt başlıklarından biri bu derste işine yarayacak: Content-Type. Sunucu gönderdiği şeyin türünü burada söyler: text/html sayfa, text/css stil dosyası, application/json JSON. Sondaki charset=utf-8 metnin harf kodlamasıdır; Türkçe harflerin doğru görünmesi buna bağlı.

Boş satırdan sonra gövde gelir: sayfanın HTML'inin kendisi. Metotların, başlıkların ve durum kodlarının hepsini Ders 26'da göreceksin.

Sayfanın üç dili: HTML, CSS, JavaScript

Sunucudan gelen sayfa üç dilde yazılır, her birinin ayrı işi var:

  • HTML sayfada ne olduğunu söyler: bu bir başlık, bu bir paragraf, bu bir düğme.
  • CSS bunların nasıl görüneceğini söyler: başlık altın sarısı, zemin koyu, düğmenin köşeleri yuvarlak.
  • JavaScript sayfanın ne yapacağını söyler: düğmeye basınca altın artsın, liste süzülsün.
HTML + CSS + JavaScript Ahri Dokuz kuyruklu tilki. Altın al Altın: 300 Ahri Dokuz kuyruklu tilki. Altın al Altın: 300 Ahri Dokuz kuyruklu tilki. Altın al Altın: 350 +50 iskelet sayfada ne var? şampiyonun kendisi görünüm nasıl görünüyor? kostümü (skin) davranış ne yapıyor? yetenekleri
Şekil 18.6 Aynı küçük sayfa: yalnız HTML, CSS eklenmiş, JavaScript de eklenmiş.

JavaScript'i zaten tanıyorsun: tarayıcının içinde de bir JavaScript motoru var, dil aynı. Değişen ortam: tarayıcıdaki JavaScript sayfaya dokunur ama diskindeki dosyaları okuyamaz; Node dosya okur ama ortada sayfa yoktur. Sayfayla konuşmayı Ders 22'de öğreneceksin.

İlk HTML dosyan

Kendi sayfanı yazma sırası. Önce klasörünü hazırla:

  1. VS Code terminalinde cd C:\kod yaz, ardından mkdir web-ilk ile yeni klasörü oluştur.
  2. File → Open Folder ile C:\kod\web-ilk klasörünü aç. Soldaki dosya listesinin başında WEB-ILK yazmalı. Güven sorusu gelirse Ders 0'daki gibi Yes, I trust the authors'a bas.
  3. Dosya listesinde boş bir yere sağ tıkla, New File seç ve adını index.html koy: küçük harf, uzantısı .html.

Neden index.html? Bir sunucuya klasörün kendisi sorulunca (/), sunucu o klasördeki index.html'i gönderir. Sitelerin ana sayfasının dosya adı neredeyse her zaman budur.

Dosyaya şunu yaz. Kopyalama; parmakların etiketlerin yazımına alışsın:

index.html — web-ilk — Visual Studio Code
index.html
<!doctype html><html lang="tr"><head>    <meta charset="utf-8">    <title>İlk sayfam</title></head><body>    <h1>Sihirdar Vadisi'ne hoş geldin</h1>    <p>Bu sayfayı kendi elimle yazdım.</p>    <p>Görünüm için CSS, davranış için JavaScript ekleyeceğim.</p></body></html>
Ln 1, Col 1Spaces: 4UTF-8HTML

< ile > arasındaki sözcüklere etiket (tag) denir. Çoğu etiket çift gelir: <h1> açar, eğik çizgili </h1> kapatır, arası içeriktir. Etiketleri Ders 19'da tek tek göreceksin; şimdilik iskeleti kalıp olarak yaz ve satırların işini bil:

SatırNe işe yarar?
<!doctype html>"Bu modern bir HTML sayfası" der; hep ilk satır.
<html lang="tr">Bütün sayfayı sarar; içerik Türkçe.
<head>Sayfa hakkında bilgiler; sayfada görünmez.
<meta charset="utf-8">Harflerin hangi kodlamayla yazıldığı.
<title>Sekmede görünen ad.
<body>Sayfada görünen her şey.
<h1>, <p>Ana başlık, paragraf.

VS Code dosyalarını zaten UTF-8 olarak kaydeder; sağ alttaki durum çubuğunda UTF-8 yazar. meta satırı bunu tarayıcıya da söyler. Yoksa ne olduğunu sık hatalarda göreceksin.

Tarayıcıda açmak

Dosyayı kaydet (Ctrl+S). Sonra Dosya Gezgini'nde (File Explorer) C:\kod\web-ilk klasörüne git ve index.html'e çift tıkla. Varsayılan tarayıcın açılır:

file:///C:/kod/web-ilk/index.html

Adres çubuğuna bak: file:///C:/kod/web-ilk/index.html. Tarayıcın baştaki file:/// yerine yalnız Dosya (File) yazısı gösteriyorsa adres çubuğuna tıkla, tamamı görünür.

Protokol bu sefer file: tarayıcı sayfayı bir sunucudan istemedi, doğrudan diskinden okudu. DNS yok, istek yok, yanıt yok. Sekmede de <title>'a yazdığın "İlk sayfam" görünür.

Şimdi <h1> içindeki yazıyı değiştir, kaydet ve tarayıcıda F5 ile yenile; yeni yazı gelir. Yaz, kaydet, yenile: web geliştirmenin nabzı bu döngüdür.

Görünüm ve davranış ekle

Sayfan çalışıyor ama bembeyaz. Şimdi ona görünüm (CSS) ve davranış (JavaScript) ekleyeceksin; ikisi ayrı dosyalarda duracak, HTML onları adlarıyla çağıracak. web-ilk klasöründe stil.css adlı bir dosya oluştur:

stil.css
body {    font-family: sans-serif;    background-color: #0f1923;    color: #f0e6d2;} h1 {    color: #c8aa6e;}

Her kural "hangi parça { özellik: değer; }" biçimindedir: body (sayfanın gövdesi) için yazı tipi ve renkler, h1 için başlık rengi; #0f1923 gibi değerler renk kodudur. CSS'i Ders 20'de öğreneceksin. Sonra uygulama.js:

uygulama.js — web-ilk — Visual Studio Code
uygulama.js
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]console.log("Sayfa yüklendi")console.log("Takımda " + takim.length + " şampiyon var")
PROBLEMSOUTPUTDEBUG CONSOLETERMINAL
PS C:\kod\web-ilk> node uygulama.jsSayfa yüklendiTakımda 5 şampiyon var
Ln 1, Col 1Spaces: 4UTF-8JavaScript

Bu dosyada sayfaya özgü bir şey yok, bu yüzden Node'da da çalışır; birazdan onu tarayıcı çalıştıracak.

Şimdi index.html'i iki satırla bu dosyalara bağla ve son paragrafı da güncelle:

index.html
<!doctype html><html lang="tr"><head>    <meta charset="utf-8">    <title>İlk sayfam</title>    <link rel="stylesheet" href="stil.css"></head><body>    <h1>Sihirdar Vadisi'ne hoş geldin</h1>    <p>Bu sayfayı kendi elimle yazdım.</p>    <p>Görünüm için CSS, davranış için JavaScript ekledim.</p>    <script src="uygulama.js"></script></body></html>
  • <link rel="stylesheet" href="stil.css"> "bu sayfanın stil dosyası şu" der. href dosyanın adresidir; yalnız adını yazdığın için tarayıcı onu sayfanın yanında, aynı klasörde arar.
  • <script src="uygulama.js"></script> "şu JavaScript dosyasını çalıştır" der. Sayfanın sonuna koyduk ki tarayıcı önce sayfayı çizsin, sonra kodu çalıştırsın; ayrıntısı Ders 22'de.

Kaydet ve tarayıcıda yenile:

file:///C:/kod/web-ilk/index.html

JavaScript nerede? console.log sayfaya değil, tarayıcının Console bölümüne yazar. F12'ye bas ve açılan geliştirici araçlarında Console sekmesine tıkla (Türkçe tarayıcıda Konsol): Sayfa yüklendi ve Takımda 5 şampiyon var orada. Aynı dosya, aynı çıktı; bu sefer onu terminal değil tarayıcı çalıştırdı.

Neden yerel sunucu?

Çift tıklayıp açmak şimdiye kadar işini gördü. Ama gerçek siteler sunucudan gelir ve file:// ile açılan sayfa bazı şeyleri yapamaz; şimdi birine çarpacaksın.

Takımı kodun içine yazmak yerine ayrı bir JSON dosyasından okumak istiyorsun. web-ilk klasöründe takim.json oluştur:

takim.json
["Ahri", "Garen", "Jinx", "Lux", "Teemo"]

uygulama.js'in içini sil ve dosyayı Ders 15'teki gibi fetch ile isteyen hâlini yaz:

uygulama.js
async function takimiYukle() {    const yanit = await fetch("takim.json")    const takim = await yanit.json()    console.log("Takımda " + takim.length + " şampiyon var, ilki " + takim[0])} console.log("Sayfa yüklendi")takimiYukle()

fetch'e yalnız dosyanın adını verdin; tarayıcı onu sayfanın adresine göre tamamlar (Node bunu yapamaz, bu kodu terminalde çalıştırma). Kaydet, file:// ile açtığın sayfayı yenile ve Console'a bak.

Sık hataAccess to fetch at 'file:///…' has been blocked by CORS policy

Ne zaman çıkar? Çift tıklayarak (file:// ile) açtığın bir sayfada fetch ile başka bir dosya isteyince:

Console
Sayfa yüklendiAccess to fetch at 'file:///C:/kod/web-ilk/takim.json' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: chrome, chrome-extension, chrome-untrusted, data, http, https, isolated-app.GET file:///C:/kod/web-ilk/takim.json net::ERR_FAILEDUncaught (in promise) TypeError: Failed to fetch    takimiYukle @ uygulama.js:2    (anonymous) @ uygulama.js:8

Son iki satır, hatanın solundaki üçgene tıklayınca açılır: hata uygulama.js'in 2. satırında, takimiYukle'nin içindeki fetch'te çıktı; o fonksiyonu da 8. satır çağırdı. Uncaught (in promise), Ders 15'teki yakalanmamış ret: fetch'in Promise'i reddedildi ve onu kimse yakalamadı.

Neden? Uzun satırın sonu, Cross origin requests are only supported for protocol schemes: …, "başka yerden veri istemek yalnız şu protokollerde olur" demek; listede http ve https var, file yok. Bu bir güvenlik kuralı: yoksa indirdiğin zararlı bir HTML dosyası diskindeki belgeleri okuyup dışarı gönderebilirdi. CORS, tarayıcının "hangi sayfa hangi adresten veri alabilir" kurallarıdır; ayrıntısı Ders 24'te.

Nasıl düzelir? Sayfayı bir sunucudan aç; aşağıda iki yolunu göreceksin.

file:// ile çift tıklamakYerel sunucu (http://)
Sayfa nereden gelir?Doğrudan disktenKendi bilgisayarındaki bir sunucudan, HTTP ile
fetch ile dosya okumakÇalışmazÇalışır
Kaydedince yenilemekElle F5Live Server kendisi yeniler

İki yol var: VS Code'un Live Server eklentisi ve terminalden npx serve. Birini seçmen yeter; çoğu kişi Live Server'ı kullanır.

Live Server ile aç

Live Server bir VS Code eklentisi (extension). İki işi var: klasörünü küçük bir sunucuyla yayınlar ve sen kaydedince tarayıcıdaki sayfayı yeniler.

  1. VS Code'da C:\kod\web-ilk klasörünün açık olduğundan emin ol.
  2. Soldaki dikey çubukta dört kareli Extensions simgesine tıkla (ya da Ctrl+Shift+X).
  3. Arama kutusuna Live Server yaz, yayıncısı Ritwick Dey olanı seç. Adı benzeyen eklentiler de var; doğrusunun kurulum sayısı 80 milyonu geçer.
  4. Install'a bas. Bu yayıncıdan ilk kez eklenti kuruyorsan VS Code "Do you trust the publisher…?" diye sorar; Trust Publisher & Install'a bas.
  5. Dosya listesinden index.html'i aç ve sağ alttaki durum çubuğunda Go Live yazısına tıkla. Aynı işi dosya listesinde index.html'e sağ tıklayıp Open with Live Server'ı seçerek de yapabilirsin.
  6. Tarayıcın http://127.0.0.1:5500/index.html adresiyle açılır. Durum çubuğundaki yazı Port : 5500 olur.

Arayüz değişmiş olabilir; düğmeler biraz farklıysa şu sözcükleri ara: Live Server, Ritwick Dey, Install, Go Live.

Sayfa aynı, adres farklı. Console'da bu sefer Takımda 5 şampiyon var, ilki Ahri satırı da var, çünkü takim.json artık HTTP ile istendi. Şimdi index.html'de başlığı değiştir ve kaydet: sayfa kendiliğinden yenilenir.

Bu, Şekil 18.3'ün alt satırındaki adres. 127.0.0.1 her bilgisayarda "bu bilgisayarın kendisi" demektir ve adı localhost'tur. Tarayıcı bu adres için DNS'e sormaz, istek bilgisayarından hiç çıkmaz; bu yüzden şifresiz http burada sorun değildir.

:5500 kısmı port. Bir bilgisayarda aynı anda birçok sunucu çalışabilir; port, isteğin hangisine gideceğini söyler. Gerçek sitelerde portu yazmazsın, çünkü https için 443, http için 80 varsayılır: Şekil 18.2'deki 76.76.21.21:443 buydu.

İşin bitince durum çubuğundaki Port : 5500 yazısına tıkla; sunucu kapanır ve sağ altta Server is now offline. yazar. 5500'ü başka bir program kullanıyorsa Live Server 5501'i dener ve bu yeni portu ayar olarak saklar; klasöründe .vscode\settings.json diye bir dosya belirirse sebebi budur. Hangi durumda olursa olsun adres çubuğundaki portu oku.

Sık hataOpen a folder or workspace... (File -> Open Folder)

Ne zaman çıkar? VS Code'da klasör açmadan, yalnız bir dosya açıkken Go Live'a basınca. Live Server bir klasörü yayınlar; klasör yoksa neyi yayınlayacağını bilemez.

Nasıl düzelir? File → Open Folder ile C:\kod\web-ilk'i aç, index.html'i seç, yeniden Go Live'a bas. Go Live hiç görünmüyorsa sol alta bak: Restricted Mode yazıyorsa Live Server kapalı kalır; Ders 0'daki gibi klasöre güven.

Alternatif: npx serve

Live Server'ı kuramıyorsan ya da VS Code dışında çalışıyorsan tek komutla da sunucu açabilirsin. npx, npm'le gelen bir araçtır: bir paketi projene kurmadan indirip çalıştırır; buradaki paket serve. VS Code terminalinde, C:\kod\web-ilk klasöründeyken:

Terminal — PowerShell
PS C:\kod\web-ilk> npx serveNeed to install the following packages:serve@14.2.6Ok to proceed? (y)    ┌──────────────────────────────────────────┐   │                                          │   │   Serving!                               │   │                                          │   │   - Local:    http://localhost:3000      │   │   - Network:  http://192.168.1.50:3000   │   │                                          │   │   Copied local address to clipboard!     │   │                                          │   └──────────────────────────────────────────┘  HTTP  11.10.2026 21:04:49 ::1 GET / HTTP  11.10.2026 21:04:49 ::1 Returned 200 in 21 ms HTTP  11.10.2026 21:04:49 ::1 GET /stil.css HTTP  11.10.2026 21:04:49 ::1 GET /uygulama.js HTTP  11.10.2026 21:04:49 ::1 Returned 200 in 3 ms HTTP  11.10.2026 21:04:49 ::1 Returned 200 in 2 ms HTTP  11.10.2026 21:04:49 ::1 GET /takim.json HTTP  11.10.2026 21:04:49 ::1 Returned 200 in 2 ms HTTP  11.10.2026 21:04:49 ::1 GET /favicon.ico HTTP  11.10.2026 21:04:49 ::1 Returned 404 in 6 ms
  • İlk seferde npx paketi indirmek için izin ister; Enter'a basman yeter (parantezdeki y "evet" ve varsayılan cevap). Sürüm numarası sende daha yeni olabilir.
  • Local: http://localhost:3000: sayfanın adresi, port bu sefer 3000. Adres panoya da kopyalandı. 3000'i başka bir program kullanıyorsa serve rastgele boş bir port seçer ve kutuya This port was picked because 3000 is in use. yazar; adresi hep kutudan oku. Network satırı aynı ağdaki başka bir cihazdan (telefonun gibi) açmak içindir ve sende farklıdır.
  • Kutunun altındaki satırlar mutfağın sipariş fişleri: sunucu her isteği yazar. GET / klasörün kendisi (sunucu index.html'i gönderdi), ardından stil dosyası, JavaScript ve fetch'in istediği takim.json; hepsi 200. ::1, 127.0.0.1'in yeni (IPv6) yazımı. Tarih biçimi Windows'unun bölge ayarına göre değişir.
  • favicon.ico için 404: Console'da da göreceğin sekme simgesi isteği. Zararsızdır.

Durdurmak için terminalde Ctrl+C'ye bas; INFO Gracefully shutting down. Please wait... yazar ve komut satırı geri gelir. İki fark daha: serve kendiliğinden yenilemez (F5 senden) ve adreslerden .html'i siler. /index.html yazarsan iki kez 301 ile önce /index'e, sonra /'ye yönlendirir.

Geliştirici araçları: sayfanın içine bak

Ders 0'da F12 ile açılan bir bölme gördün; şimdi onu kullanacaksın. Sayfanı Live Server ile aç ve F12'ye bas (ya da sayfada sağ tıklayıp İncele / Inspect). Chrome, Edge ve Brave'de bu bölme hemen hemen aynıdır; aşağıdaki gerçek görüntüler Chrome'un temeli Chromium'dan.

Bölme pencerenin sağına ya da altına yerleşir; yerini sağ üstteki ⋮ menüsünde Dock side (Yerleşim tarafı) satırından değiştirirsin. Tarayıcın Türkçeyse sekmelerin adları da Türkçedir:

İngilizceTürkçe tarayıcıdaNe gösterir?
ElementsÖğelerSayfanın HTML'i, canlı hâliyle
ConsoleKonsolJavaScript mesajları, hatalar ve kod yazılan satır
NetworkAğSayfanın bütün istekleri ve yanıtları
SourcesKaynaklarSayfanın dosyaları

Elements: canlı HTML

127.0.0.1:5500/index.html
Üstte ilk sayfa: Sihirdar Vadisi'ne hoş geldin başlığı mavi bir kutuyla, çevresindeki boşluk turuncuyla boyanmış; altında h1 784 × 37 yazan küçük bir etiket. Altta geliştirici araçları, Elements sekmesi açık: HTML ağacında doctype, html, kapalı head, açık body ve içinde h1, iki p, script satırları, en altta Code injected by live-server yorumu ve bir script. h1 satırı seçili. Sağdaki Styles bölmesinde h1 için color: #c8aa6e kuralı ve yanında stil.css:7.

Elements sayfanın HTML'ini ağaç olarak gösterir. Ağaçta bir satırın üstüne gelince sayfada o parça boyanır: görüntüde <h1> seçili, başlık mavi, çevresindeki boşluk turuncu. Tersi için sol üstteki ok simgesine, sonra sayfada bir parçaya tıkla. Sağdaki Styles seçili parçanın CSS kurallarını, geldikleri yerle (stil.css:7) gösterir.

Şunu dene: <h1> satırındaki yazıya çift tıkla, başka bir şey yaz ve Enter'a bas; sayfa anında değişir. F5'e basınca eski yazı geri gelir. Elements'teki değişiklik yalnız tarayıcının bellekteki kopyasındadır; dosyana da sunucuya da bir şey gitmez.

Ağacın sonundaki <!-- Code injected by live-server --> yorumunu ve <script>'i sen yazmadın: Live Server sayfayı gönderirken ekliyor, kaydettiğinde sayfayı yenileyen kod bu. Sayfayı npx serve ile açarsan görünmez.

Console: mesajlar ve hatalar

Console sekmesi. Satırlar: Sayfa yüklendi, sağında uygulama.js:7; Live reload enabled., sağında index.html:41; Takımda 5 şampiyon var, ilki Ahri, sağında uygulama.js:4; kırmızı zeminli GET http://127.0.0.1:5500/favicon.ico 404 (Not Found); en altta yazılan 2 + 3 ve cevabı 5. Sağ üstte kırmızı 1.
Şekil 18.7 Console sekmesi, Live Server'la açılan ilk sayfada (gerçek ekran görüntüsü).

Console'da üç tür satır görürsün:

  • Senin mesajların: sağlarında geldikleri dosya ve satır yazar (uygulama.js:7); tıklarsan o satıra gidersin.
  • Araçların mesajları: Live reload enabled. Live Server'ın "otomatik yenileme açık" demesi. Sayfayı yenileyince bir daha görünmeyebilir.
  • Hatalar: kırmızı satırlar. Buradaki zararsız: tarayıcı sekmedeki küçük simgeyi (favicon) kendiliğinden istedi, sende favicon.ico yok, 404 geldi. Sağ üstteki kırmızı 1 hata sayısı.

En alttaki > işaretinin yanına JavaScript yazıp Enter'a basabilirsin: 2 + 3 yaz, 5 döner. Sayfan "çalışmıyor" gibi görünüyorsa ilk bakacağın yer burası.

Network: bütün istekler

Network sekmesi. Üstte araç çubuğu, Disable cache kutusu, filtre düğmeleri ve zaman çizelgesi. Altta tablo, sütunlar Name, Status, Type, Initiator, Size, Time: index.html 200 document Other 2.2 kB; stil.css 200 stylesheet index.html:6 0.4 kB; uygulama.js 200 script index.html:12 0.6 kB; takim.json 200 fetch uygulama.js:2 0.3 kB; ws 101 websocket index.html:35; kırmızı favicon.ico 404 text/html. En altta 6 requests.
Şekil 18.8 Network sekmesi: ilk sayfa açılırken gönderilen altı istek (gerçek ekran görüntüsü; boyutlar ve süreler sende farklı olur).

Network yalnız geliştirici araçları açıkken olan istekleri kaydeder; liste boşsa sayfayı yenile (F5). Her satır bir istek. Sütunlar (Türkçesi parantezde):

  • Name (Ad) istenen dosya, Status (Durum) durum kodu, Type (Tür) dosyanın türü: document sayfanın kendisi.
  • Initiator (Başlatan) isteği kimin gönderdiğini söyler: index.html:6 <link> satırı, index.html:12 <script> satırı, uygulama.js:2 de fetch. Tarayıcının HTML'de adı geçen her dosyayı ayrıca istediği burada görünür.
  • Size (Boyut) ve Time (Zaman): gelen veri ve geçen süre.

ws satırı Live Server'ın tarayıcıyla açık tuttuğu bağlantı (101: "protokol değiştiriliyor"); kaydettiğinde "yenile" haberi buradan gelir.

Bir satıra tıklayınca ayrıntısı açılır: Headers (Başlıklar) HTTP bölümünde gördüğün parçaları, Response (Yanıt) sunucunun gönderdiği metni gösterir. Bunu bu sitede de dene: F12, Network, F5, en üstteki satır, Headers.

Network sekmesinde solda istek listesi: xdd.baby seçili, altında css2?family=Inter, styles.css, landing.css, discord-soon.png, icons.js. Sağda Headers sekmesi, General bölümü: Request URL https://xdd.baby/, Request Method GET, Status Code yeşil noktayla 200 OK, Remote Address 76.76.21.21:443, Referrer Policy strict-origin-when-cross-origin.
Şekil 18.9 xdd.baby açılırken Network: ilk satır (sayfanın kendisi) seçili, sağda Headers (gerçek ekran görüntüsü). Bu ders sayfasında ilk satırın adı ders18 olur.

General (Genel) bölümünde Request URL (İstek URL'si), Request Method (İstek yöntemi) ve Status Code (Durum kodu) var. Remote Address (Uzak adres) 76.76.21.21:443: nslookup'ta bulduğun numara ve https'nin kapısı. Aşağıda :method, :path gibi iki noktalı başlık adları görürsen şaşırma; tarayıcın bu siteyle HTTP'nin yeni sürümü HTTP/2'yi konuşuyor.

Sık hataUncaught ReferenceError: takm is not defined

Ne zaman çıkar? Sayfadaki JavaScript'te bir adı yanlış yazınca: Node'dan tanıdığın hata, bu kez Console'da. Şu satırda takim yerine takm yazılmış:

uygulama.js
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]console.log("Sayfa yüklendi")console.log("Takımda " + takm.length + " şampiyon var")
Hata çıktısı
Sayfa yüklendiC:\kod\web-ilk\uygulama.js:3console.log("Takımda " + takm.length + " şampiyon var")                         ^ ReferenceError: takm is not defined    at Object.<anonymous> (C:\kod\web-ilk\uygulama.js:3:26)    ... Node.js v24.20.0

Yukarıdaki, Node'un terminale yazdığı. Tarayıcıda aynı dosya Console'a şunu yazar:

Console
Sayfa yüklendiUncaught ReferenceError: takm is not defined    at uygulama.js:3:26

Uncaught "yakalanmadı" demek: hatayı bir try/catch yakalamadı (Ders 13). Sayfa kapanmaz, çizilmiş hâliyle durur; ama o dosyada hatadan sonraki satırlar çalışmaz. Sayfan yarım çalışıyor gibiyse önce Console'a bak.

Nasıl düzelir? Sağdaki uygulama.js:3 bağlantısına tıkla; Sources sekmesi dosyayı o satırda açar. Adı tanımladığın hâliyle yaz.

Sık hataRefused to apply style from '…' because its MIME type ('text/html') is not a supported stylesheet MIME type

Ne zaman çıkar? <link>'teki dosya adını yanlış yazınca (stil.ccs). Sayfa stilsiz, düz siyah beyaz görünür.

index.html
    <link rel="stylesheet" href="stil.ccs">
Console
Refused to apply style from 'http://127.0.0.1:5500/stil.ccs' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled.

Neden? Mesaj yanıltıcı: asıl sorun "MIME türü" değil, dosyanın bulunamaması. Network'e bak: stil.ccs satırı kırmızı, durumu 404. Live Server "böyle bir dosya yok" diyen küçük bir HTML sayfası (Cannot GET /stil.ccs) gönderdi; tarayıcı stil dosyası beklerken HTML gelince onu uygulamadı.

MIME türü, Content-Type başlığındaki text/html, text/css gibi tür adlarıdır. JavaScript dosyasının adını yanlış yazarsan kardeşini görürsün: Refused to execute script from '…' because its MIME type ('text/html') is not executable.

Nasıl düzelir? Network'teki kırmızı satırın adını klasöründeki dosya adıyla karşılaştır; href ya da src'deki yazımı düzelt.

Sık hatalar

Bu derste karşılaşabileceğin öteki hatalar; hepsi hata rehberinde de var.

Sık hataTürkçe harfler bozuk: hoÅŸ geldin

Ne zaman çıkar? <meta charset="utf-8"> satırı yoksa ve sunucu da kodlamayı söylemiyorsa. Tarayıcı tahmin eder ve eski bir Batı ya da Türkçe kodlama seçer: UTF-8'de iki bayt tutan her Türkçe harf iki garip işarete dönüşür, sekmedeki başlık da İlk sayfam olur.

Meta satırı olmayan ilk sayfa bozuk harflerle: başlıkta Sihirdar Vadisi'ne hoÅŸ geldin, altında Bu sayfayı kendi elimle yazdım ve Görünüm için CSS, davranış için JavaScript ekleyeceÄŸim yazıyor.
Şekil 18.10 meta satırı olmayan ilk sayfa, kodlamasını söylemeyen bir sunucudan gelince (gerçek ekran görüntüsü).

Bu hatayı her zaman göremezsin: çift tıklayınca Chrome UTF-8 olduğunu kendisi anlar; Live Server charset=UTF-8, serve de charset=utf-8 der (büyük ya da küçük harf fark etmez). Ama kodlamayı söylemeyen bir sunucuda harfler böyle bozulur; Ders 27'de kendi sunucunu yazarken bunu yaşayacaksın.

Nasıl düzelir? <head>'in ilk satırı <meta charset="utf-8"> olsun; tahmine bırakma. Dosyanın kendisi de UTF-8 kaydedilmiş olmalı: VS Code'un durum çubuğunda UTF-8 yazdığına bak.

Sık hataDeğişiklik sayfaya yansımıyor

Ne zaman çıkar? Dosyayı değiştirip kaydetmeden tarayıcıyı yenileyince. Tarayıcı da sunucu da diskteki dosyayı okur, VS Code'da kaydetmediğin hâli bilmez; Live Server da yalnız kaydedince yeniler.

index.html — web-ilk — Visual Studio Code
index.html●
<body>    <h1>Sihirdar Vadisi'ne tekrar hoş geldin</h1>
Ln 1, Col 1Spaces: 4UTF-8HTML

Nasıl düzelir? Sekmedeki ● işaretine bak ve Ctrl+S ile kaydet; Ders 0'daki File → Auto Save bu sorunu neredeyse bitirir. Kaydettiğin hâlde değişmiyorsa sonraki karta bak: belki başka bir dosyaya bakıyorsun.

Sık hataDeğiştirdiğin dosya başka, açtığın dosya başka

Ne zaman çıkar? Bilgisayarında aynı adlı iki dosya varsa (indirilenler klasöründe bir index.html, C:\kod\web-ilk'te bir tane) ya da sunucuyu yanlış klasörde başlatınca. Örneğin npx serve'ü C:\kod'da çalıştırırsan sayfan yerine klasörlerin listesi gelir:

localhost:3000
serve'ün klasör listesi: başlıkta Index of kod/, altında metin-rpg/, ogren/, takim-savasi/ ve web-ilk/ klasörleri.

Nasıl düzelir? Adres çubuğunu oku: file:/// ile açtıysan tam yol orada yazar, gerçekten C:/kod/web-ilk/index.html mi? Sunucu kullanıyorsan terminalin istemine bak; PS C:\kod> değil PS C:\kod\web-ilk> olmalı. Ctrl+C ile durdur, cd web-ilk ile klasöre gir, sunucuyu yeniden başlat.

Sık hataSayfa yerine dosya listesi açılıyor: index.html.txt

Ne zaman çıkar? Dosyayı Dosya Gezgini'nde Yeni → Metin Belgesi (New → Text Document) ile oluşturup adını index.html yapınca. Uzantılar gizliyse gerçek adı index.html.txt olur: Ders 0'daki uzantı tuzağı. Çift tıklayınca tarayıcı yerine Not Defteri açılır. Go Live'a basarsan Live Server açık dosyayı sayfa saymaz; tarayıcıyı http://127.0.0.1:5500/ adresiyle açar ve sayfan yerine klasördeki dosyaları listeler:

127.0.0.1:5500
Live Server'ın klasör listesi: solda ~ / başlığı, altında index.html.txt, stil.css ve uygulama.js dosyaları, sağ üstte Search kutusu.

Listede dosyanın gerçek adı görünüyor. Ona tıklarsan sayfa değil, kodun kendisi düz yazı olarak gelir. http://127.0.0.1:5500/index.html adresini elle açarsan Cannot GET /index.html yazan bir sayfa gelir: sunucuda o adda dosya yok. Terminalde ls de gerçeği söyler:

Terminal — PowerShell
PS C:\kod\web-ilk> ls      Directory: C:\kod\web-ilk  Mode                 LastWriteTime         Length Name----                 -------------         ------ -----a----        11.10.2026     21:11            384 index.html.txt-a----        11.10.2026     21:11            124 stil.css-a----        11.10.2026     21:11            147 uygulama.js

Nasıl düzelir? VS Code'un dosya listesi adın tamamını gösterir: dosyaya sağ tıkla, Rename ile adını index.html yap. Dosya Gezgini'nde uzantıların görünür olduğundan emin ol.

Görevler

Görevleri C:\kod\web-ilk ve C:\kod\ogren\ders18.js üzerinde yap. Önce kendin dene, takılırsan ipuçlarını sırayla aç. Çözüme en son bak.

Görev 1

Adresi parçala

Aşağıdaki adresi önce kâğıt üzerinde parçalarına ayır: protokol, alan adı, port, yol, sorgu, parça. Sonra cevabını ders18.js'te new URL ile denetle.

Metin
https://magaza.example.com:8443/esyalar/kilic?renk=kirmizi&sayfa=2#yorumlar

Bitirince iki sınır durumunu dene: yol ve port yazılmamış https://xdd.baby ile http://127.0.0.1:5500/index.html. Bunların pathname ve port değerleri ne olur?

İpucu 1

Alanların adları: protocol, hostname, port, pathname, search, hash. Her birini ayrı bir console.log ile yazdır.

İpucu 2

Sorguda iki çift var; & onları ayırır. Sunucuya gitmeyen tek parçayı da işaretlemeyi unutma.

Çözümü göster
ders18.js
const adres = new URL("https://magaza.example.com:8443/esyalar/kilic?renk=kirmizi&sayfa=2#yorumlar")console.log(adres.protocol)console.log(adres.hostname)console.log(adres.port)console.log(adres.pathname)console.log(adres.search)console.log(adres.hash)
Çıktı
https:magaza.example.com8443/esyalar/kilic?renk=kirmizi&sayfa=2#yorumlar

Sınır durumları:

ders18.js
const kisa = new URL("https://xdd.baby")console.log(kisa.pathname)console.log(kisa.port === "")const yerel = new URL("http://127.0.0.1:5500/index.html")console.log(yerel.pathname, yerel.port)
Çıktı
/true/index.html 5500

Yol yazılmasa da / olur: ana sayfa istenir. port boş metindir, çünkü https'nin varsayılan kapısı 443 adreste yazılmaz. Port yazılınca da alan onu metin olarak verir ("5500"; console.log tırnaksız yazar). #yorumlar sunucuya gitmez; sorgunun iki çifti renk=kirmizi ve sayfa=2.

Görev 2

DNS dedektifi

nslookup ile üç adı sorgula: github.com, www.github.com ve bilerek yanlış yazılmış githb.cmo. Sonra şu soruları cevapla: www'lu ve www'suz ad aynı yere mi çıkıyor? Yanlış adda nslookup ne diyor? O yanlış adı tarayıcıda başıyla birlikte (https://githb.cmo) açarsan hangi hata sayfası gelir?

İpucu 1

Her ad için ayrı bir nslookup komutu yaz. Cevap, Non-authoritative answer: satırından sonra gelir.

İpucu 2

Aliases "takma adlar" demek: sorduğun ad başka bir adın takma adıysa orada yazar.

Çözümü göster

Bu ders yazılırken alınan cevaplar (IP adresleri zamanla ve yere göre değişebilir):

Terminal
PS C:\kod> nslookup github.comServer:  dns.googleAddress:  2001:4860:4860::8888 Non-authoritative answer:Name:    github.comAddress:  140.82.121.4 PS C:\kod> nslookup www.github.comServer:  dns.googleAddress:  2001:4860:4860::8888 Non-authoritative answer:Name:    github.comAddress:  140.82.121.3Aliases:  www.github.com PS C:\kod> nslookup githb.cmoServer:  dns.googleAddress:  2001:4860:4860::8888 *** dns.google can't find githb.cmo: Non-existent domain
  • www.github.com, github.com'un takma adıdır (Aliases); ikisi aynı siteye çıkar. Büyük siteler birden çok sunucu kullandığı için numaranın son hanesi sorgudan sorguya değişebilir.
  • Yanlış adda Non-existent domain: "böyle bir alan adı yok".
  • Tarayıcıda DNS hata kartındaki Bu siteye ulaşılamıyor (This site can’t be reached) sayfası ve ERR_NAME_NOT_RESOLVED kodu gelir.
Görev 3

İkinci sayfa: oyuncu profili

web-ilk klasöründe profil.html adında ikinci bir sayfa yaz. Sekmede "Oyuncu profili" yazsın; sayfada oyuncu adın ana başlık olsun, altında iki paragraf: ana rolün ve en sevdiğin şampiyon. Sayfa stil.css'i kullansın. Live Server açıkken onu http://127.0.0.1:5500/profil.html adresinden aç.

Sonra iki deneme yap ve sonuçlarını açıkla:

  1. <meta charset="utf-8"> satırını sil ve kaydet. Türkçe harfler bozuldu mu?
  2. Adres çubuğunda profil.html yerine Profil.html yaz. Sayfa açıldı mı?
İpucu 1

İskeleti bir kez daha elle yaz. Değişecek yerler <title>, <h1> ve paragraflar; <script> satırına bu sayfada gerek yok.

İpucu 2

Birinci deneme için Network'te profil.html'e tıkla ve Headers'taki Content-Type satırını oku.

Çözümü göster
profil.html
<!doctype html><html lang="tr"><head>    <meta charset="utf-8">    <title>Oyuncu profili</title>    <link rel="stylesheet" href="stil.css"></head><body>    <h1>Deniz</h1>    <p>Ana rolüm: orta koridor.</p>    <p>En sevdiğim şampiyon: Ahri.</p></body></html>
  1. Live Server'da harfler bozulmaz, çünkü Live Server Content-Type başlığında charset=UTF-8 diyerek kodlamayı zaten söylüyor. Yine de satırı geri koy: kodlamayı söylemeyen bir sunucuda aynı sayfa hoÅŸ gibi bozulur.
  2. Açılır, çünkü Windows dosya adlarında büyük-küçük harf ayırmaz. Sitelerin çoğunun çalıştığı Linux sunucular ise ayırır; orada Profil.html adresi 404 verir. Dosya adlarını ve bağlantıları hep küçük harfle yaz.
Görev 4

Bozuk sayfayı onar

Bu görevde sayfayı sen bozacaksın; asıl iş, bozulmayı geliştirici araçlarında okumak. İleride bir sayfa bozulduğunda sebebini bilmeyeceksin, elinde yalnız bu ekranlar olacak. Live Server açıkken iki dosyada birer satırı aşağıdaki gibi değiştir: index.html stil dosyasını olmayan bir css klasöründe arasın, uygulama.js de olmayan bir JSON dosyasını istesin.

index.html✗ Yanlış
    <link rel="stylesheet" href="css/stil.css">
uygulama.js✗ Yanlış
    const yanit = await fetch("takimlar.json")

Kaydetmeden önce tahmin et: Network'te hangi satırlar kırmızı olacak, durumları ne olacak? Console'da Sayfa yüklendi yine yazılacak mı? Sonra kaydet, tahminini geliştirici araçlarıyla denetle ve iki satırı onar.

İpucu 1

Network sekmesini aç ve sayfayı yenile (F5). Kırmızı satırların Status ve Initiator sütunlarını oku: hangi dosya bulunamadı, isteği kim gönderdi?

İpucu 2

Name sütunu yalnız dosyanın adını gösterir, klasörünü göstermez. Tam adres için satıra tıklayıp Headers'taki Request URL'ye ya da Console'daki Refused to… mesajında tırnak içindeki adrese bak.

İpucu 3

SyntaxError: Unexpected token '<' mesajını Ders 15'ten tanıyorsun: fetch 404'te hata fırlatmaz; yanit.json() gelen HTML hata sayfasını JSON sanıp çevirmeye çalışır.

Çözümü göster

Network'te iki kırmızı satır var (tanıdığın favicon.ico da üçüncüsü olabilir):

NameStatusTypeInitiator
stil.css404stylesheetindex.html:6
takimlar.json404fetchuygulama.js:2

Sayfa stilsizdir. Console'da şu satırlar durur (Live Server'ın Live reload enabled. satırı ve favicon satırı da araya karışabilir):

Console
Refused to apply style from 'http://127.0.0.1:5500/css/stil.css' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled.Sayfa yüklendiGET http://127.0.0.1:5500/takimlar.json 404 (Not Found)Uncaught (in promise) SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON
  • Stil: Name sütununda stil.css yazsa da adres css/stil.css; tarayıcı dosyayı olmayan bir klasörde aradı. Düzeltme href="stil.css". (Ya da gerçekten bir css klasörü açıp stil.css'i içine taşı; büyük projelerde dosyalar böyle klasörlere ayrılır.)
  • JSON: Sayfa yüklendi geldi, yani uygulama.js çalışıyor; sorun fetch'te. Sunucu 404 ile "böyle bir dosya yok" diyen bir HTML sayfası gönderdi, fetch hata fırlatmadı, yanit.json() bu HTML'i JSON sanıp daha ilk işarette (<) takıldı. Düzeltme fetch("takim.json"). Ders 15'teki yanit.ok denetimini ekleseydin mesaj doğrudan İstek başarısız: 404 derdi.

Kaydedince Live Server sayfayı yeniler; renkler ve Takımda 5 şampiyon var, ilki Ahri satırı geri gelir. Sınır denemesi: yalnız birini düzeltip yenile. Öteki hata tek başına kalır, çünkü stil dosyası ile JSON birbirinden bağımsız istenir.

Görev 5

Sunucunun gözünden

npx serve ile web-ilk klasörünü yayınla. Tarayıcının önbelleği boş başlasın diye yeni bir gizli pencere aç (Ctrl+Shift+N; Edge'de adı InPrivate) ve şu dört adresi orada sırayla aç. Her birinden önce terminalde hangi GET satırlarının çıkacağını ve hangi durum kodlarının geleceğini tahmin et, sonra terminale bak:

  1. http://localhost:3000
  2. http://localhost:3000/takim.json
  3. http://localhost:3000/yok.html
  4. http://localhost:3000/?sekme=ozet#gorevler
İpucu 1

İlk adreste tarayıcı HTML'de adı geçen her dosya için ayrı istek gönderir; fetch de bir istektir.

İpucu 2

İkinci adresteki dosyayı tarayıcı az önce fetch ile almıştı. Değişmemiş dosya için hangi kod geliyordu?

İpucu 3

serve adreslerden .html'i siler. Dördüncü adreste hangi parça sunucuya hiç gitmez?

Çözümü göster

Bu ders yazılırken terminalde, çerçevenin altında beliren kayıtlar (tarih, saat ve süreler sende farklı olur):

Terminal
 HTTP  11.10.2026 21:04:49 ::1 GET / HTTP  11.10.2026 21:04:49 ::1 Returned 200 in 21 ms HTTP  11.10.2026 21:04:49 ::1 GET /stil.css HTTP  11.10.2026 21:04:49 ::1 GET /uygulama.js HTTP  11.10.2026 21:04:49 ::1 Returned 200 in 3 ms HTTP  11.10.2026 21:04:49 ::1 Returned 200 in 2 ms HTTP  11.10.2026 21:04:49 ::1 GET /takim.json HTTP  11.10.2026 21:04:49 ::1 Returned 200 in 2 ms HTTP  11.10.2026 21:04:49 ::1 GET /favicon.ico HTTP  11.10.2026 21:04:49 ::1 Returned 404 in 6 ms HTTP  11.10.2026 21:04:51 ::1 GET /takim.json HTTP  11.10.2026 21:04:51 ::1 Returned 304 in 2 ms HTTP  11.10.2026 21:04:53 ::1 GET /yok.html HTTP  11.10.2026 21:04:53 ::1 Returned 301 in 1 ms HTTP  11.10.2026 21:04:53 ::1 GET /yok HTTP  11.10.2026 21:04:53 ::1 Returned 404 in 2 ms HTTP  11.10.2026 21:04:55 ::1 GET /?sekme=ozet HTTP  11.10.2026 21:04:55 ::1 Returned 200 in 8 ms HTTP  11.10.2026 21:04:55 ::1 GET /stil.css HTTP  11.10.2026 21:04:55 ::1 Returned 304 in 1 ms HTTP  11.10.2026 21:04:55 ::1 GET /uygulama.js HTTP  11.10.2026 21:04:55 ::1 Returned 304 in 1 ms HTTP  11.10.2026 21:04:55 ::1 GET /takim.json HTTP  11.10.2026 21:04:55 ::1 Returned 304 in 2 ms
  1. Dört istek, dört 200: / (sunucu index.html'i gönderdi), stil.css, uygulama.js ve sayfadaki fetch'in istediği takim.json. Bir de favicon.ico isteği 404 aldı.
  2. takim.json için 304: tarayıcının elinde aynı dosya vardı; sunucu "değişmedi, elindekini kullan" dedi ve dosyayı yeniden göndermedi.
  3. yok.html için önce 301: serve .html'i silip tarayıcıyı /yok adresine gönderdi. Orada da dosya olmadığı için 404 geldi; tarayıcıda 404 The requested path could not be found yazar.
  4. Sunucu GET /?sekme=ozet gördü: sorgu gitti, #gorevler gitmedi, çünkü parça yalnız tarayıcıda yaşar. Sunucu sorguyu dikkate almadan yine index.html'i gönderdi (200), sayfanın dosyaları için de 304 geldi.

Geliştirici araçlarında Disable cache işaretliyse 304 yerine hep 200 görürsün: tarayıcı elindeki kopyayı hiç sormadan dosyaları baştan ister.

Kendini sına

Soru 1

Adres çubuğuna https://xdd.baby/ders18 yazıp Enter'a bastın. Şu adımları doğru sıraya diz.

  • (a) Sunucu 200 ve HTML gönderir.
  • (b) Tarayıcı GET /ders18 isteğini gönderir.
  • (c) xdd.baby'nin IP adresi bulunur.
  • (d) Tarayıcı CSS ve JS için yeni istekler gönderir.
  • (e) 76.76.21.21 adresine bağlantı açılır.
Cevabı göster

c, e, b, a, d. Önce ad numaraya çevrilir (DNS), sonra o numaraya bağlanılır, istek gider ve yanıt gelir; tarayıcı HTML'de adı geçen dosyaları ayrıca ister.

Soru 2

https://xdd.baby/ders18?tema=acik#gorevler adresinde yol, sorgu ve parça hangisi? Hangisi sunucuya gitmez?

Cevabı göster

Yol /ders18, sorgu ?tema=acik, parça #gorevler. Parça sunucuya gönderilmez; tarayıcı onu sayfanın içinde o adlı yere kaydırmak için kullanır.

Soru 3

Hangisi HTML'in, hangisi CSS'in, hangisi JavaScript'in işi?

  1. Başlık altın sarısı olsun.
  2. Sayfada bir başlık ve iki paragraf olsun.
  3. Düğmeye basınca altın 50 artsın.
  4. Zemin koyu lacivert olsun.
Cevabı göster

1 CSS, 2 HTML, 3 JavaScript, 4 CSS. Kural: "ne var?" sorusunun cevabı HTML, "nasıl görünüyor?" CSS, "ne olunca ne yapıyor?" JavaScript.

Soru 4

Sayfayı çift tıklayıp açtın, fetch("takim.json") çalışmıyor; aynı kod Live Server'da çalışıyor. Neden?

Cevabı göster

Çift tıklayınca sayfa file:// ile diskten açılır; tarayıcı güvenlik için böyle sayfaların fetch ile dosya okumasına izin vermez (blocked by CORS policy). Live Server sayfayı http:// ile sunar, istekler gerçek sitedeki gibi HTTP ile gider.

Soru 5

Elements sekmesinde başlığı değiştirdin, sayfa değişti. F5'e basınca eski hâli geri geldi. Neden? Kalıcı değişiklik için ne yapmalısın?

Cevabı göster

Elements tarayıcının bellekteki kopyasını gösterir; oradaki değişiklik dosyana da sunucuya da gitmez. Yenileyince tarayıcı sayfayı yeniden ister ve diskteki değişmemiş dosya gelir. Kalıcı değişiklik için dosyayı VS Code'da düzenleyip kaydet.

Soru 6

Data Dragon'dan sürümleri çeken bir sayfa çalışmıyor; Console'da şunlar var. Sorun ne? Sunucu bir durum kodu gönderdi mi?

Console
GET https://ddragon.leagueoflegends.cmo/api/versions.json net::ERR_NAME_NOT_RESOLVEDUncaught (in promise) TypeError: Failed to fetch    at surumleriYukle (uygulama.js:2:25)    at uygulama.js:7:1
Cevabı göster

Alan adı yanlış yazılmış: .com yerine .cmo. ERR_NAME_NOT_RESOLVED "ad çözülemedi" demek: DNS bu ada bir numara bulamadı, istek hiçbir sunucuya ulaşmadı. Bu yüzden durum kodu da yok; satırda 404 gibi bir sayı değil, tarayıcının kendi hata kodu var. fetch'in Promise'i reddedildi ve onu kimse yakalamadı (Uncaught (in promise)). Ders 15'te Node aynı adreste TypeError: fetch failed ve altında getaddrinfo ENOTFOUND demişti: aynı DNS hatası.

Kayıt noktası

web-ilk yeni bir proje klasörü; Git'in onu tanıması için orada bir kez git init gerekiyor.

Bir sonraki derste HTML'i derinlemesine öğreneceksin: başlıklar, bağlantılar, resimler, listeler, tablolar ve form elemanlarıyla anlamlı bir sayfa iskeleti kuracaksın.

İşaret yalnızca bu tarayıcıda saklanır, kimseye gönderilmez.