{"id":42682,"date":"2026-06-19T14:04:25","date_gmt":"2026-06-19T11:04:25","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/"},"modified":"2026-06-19T14:05:05","modified_gmt":"2026-06-19T11:05:05","slug":"javascript-fetch-api-modern-web-istekleri-nasil-yapilir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/","title":{"rendered":"JavaScript Fetch API: Modern Web \u0130stekleri Nas\u0131l Yap\u0131l\u0131r?"},"content":{"rendered":"<h2>JavaScript Fetch API: Modern Web \u0130stekleri Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131, sunucudan veri almak ve sunucuya veri g\u00f6ndermek gibi bir\u00e7ok a\u011f ileti\u015fimini ger\u00e7ekle\u015ftirmek zorundad\u0131r. Bu ileti\u015fimler, web sitelerinin dinamik olmas\u0131n\u0131, kullan\u0131c\u0131lar\u0131n ger\u00e7ek zamanl\u0131 bilgiye ula\u015fmas\u0131n\u0131 ve etkile\u015fimli deneyimler ya\u015famas\u0131n\u0131 sa\u011flar. Eskiden bu i\u015flemler i\u00e7in <code class=\"language-\">XMLHttpRequest<\/code> gibi daha karma\u015f\u0131k ve eski nesil y\u00f6ntemler kullan\u0131l\u0131rken, modern JavaScript d\u00fcnyas\u0131 bize \u00e7ok daha zarif ve g\u00fc\u00e7l\u00fc bir ara\u00e7 sunuyor: Fetch API. Fetch API, a\u011f isteklerini y\u00f6netmek i\u00e7in daha temiz bir s\u00f6z dizimi ve daha iyi bir geli\u015ftirici deneyimi vaat eder. Bu makalede, Fetch API&#8217;nin temellerinden ba\u015flayarak, \u00e7e\u015fitli senaryolarda nas\u0131l kullan\u0131laca\u011f\u0131na dair ad\u0131m ad\u0131m \u00f6rnekler ve ileri d\u00fczey ipu\u00e7lar\u0131 ile konuyu derinlemesine inceleyece\u011fiz. Amac\u0131m\u0131z, bu g\u00fc\u00e7l\u00fc API&#8217;yi tam olarak anlaman\u0131z\u0131 ve projelerinizde etkili bir \u015fekilde kullanabilmenizi sa\u011flamakt\u0131r.<\/p>\n<h3>Fetch API Nedir ve Neden Kullanmal\u0131s\u0131n\u0131z?<\/h3>\n<p>Fetch API, web taray\u0131c\u0131lar\u0131nda yerle\u015fik olarak bulunan, a\u011f istekleri yapmak i\u00e7in modern bir aray\u00fczd\u00fcr. Temel olarak, <code class=\"language-\">XMLHttpRequest<\/code>&#8216;in yerini almay\u0131 hedefleyen, Promise tabanl\u0131 bir \u00e7\u00f6z\u00fcm sunar. Bu, a\u011f isteklerinin asenkron do\u011fas\u0131n\u0131 daha kolay y\u00f6netmenizi sa\u011flar. Geli\u015ftiriciler i\u00e7in en b\u00fcy\u00fck avantaj\u0131, s\u00f6z diziminin daha basit ve okunabilir olmas\u0131d\u0131r. <code class=\"language-\">XMLHttpRequest<\/code>&#8216;in olay dinleyicileri ve karma\u015f\u0131k yap\u0131s\u0131 yerine, Fetch API&#8217;de <code class=\"language-\">then()<\/code> ve <code class=\"language-\">catch()<\/code> gibi Promise metotlar\u0131 sayesinde isteklerin ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 veya bir hata olu\u015fup olu\u015fmad\u0131\u011f\u0131n\u0131 net bir \u015fekilde y\u00f6netebilirsiniz.<\/p>\n<p>Peki, neden Fetch API&#8217;yi tercih etmelisiniz? \u00d6ncelikle, daha modern ve standartlara uygun bir yakla\u015f\u0131md\u0131r. Taray\u0131c\u0131lar taraf\u0131ndan geni\u015f \u00e7apta desteklenir ve gelecekteki web standartlar\u0131n\u0131n temelini olu\u015fturur. \u0130kinci olarak, Promise tabanl\u0131 olmas\u0131 sayesinde asenkron kodunuzu daha anla\u015f\u0131l\u0131r ve y\u00f6netilebilir hale getirir. Bu, \u00f6zellikle birden fazla a\u011f iste\u011fini e\u015f zamanl\u0131 olarak yapmak veya bir iste\u011fin sonucuna g\u00f6re ba\u015fka i\u015flemler ger\u00e7ekle\u015ftirmek istedi\u011finizde b\u00fcy\u00fck bir fark yarat\u0131r. \u00dc\u00e7\u00fcnc\u00fcs\u00fc, daha esnektir. \u0130stek ba\u015fl\u0131klar\u0131n\u0131 (headers), y\u00f6ntemlerini (method), g\u00f6vdesini (body) ve di\u011fer bir\u00e7ok se\u00e7ene\u011fi kolayca yap\u0131land\u0131rabilirsiniz. Bu esneklik, RESTful API&#8217;lerle etkile\u015fim kurarken veya \u00f6zel a\u011f protokollerini kullan\u0131rken size b\u00fcy\u00fck avantaj sa\u011flar. Son olarak, ayr\u0131\u015ft\u0131r\u0131lm\u0131\u015f bir mimariye sahiptir. \u0130stek ve yan\u0131t nesneleri ayr\u0131 ayr\u0131 ele al\u0131n\u0131r, bu da veriyi i\u015fleme s\u00fcrecini daha mod\u00fcler hale getirir.<\/p>\n<p>Bu \u00f6zellikler, Fetch API&#8217;yi sadece basit veri \u00e7ekme i\u015flemleri i\u00e7in de\u011fil, ayn\u0131 zamanda karma\u015f\u0131k API entegrasyonlar\u0131, ger\u00e7ek zamanl\u0131 g\u00fcncellemeler ve hatta dosya y\u00fckleme\/indirme gibi geli\u015fmi\u015f senaryolar i\u00e7in de ideal bir ara\u00e7 haline getirir. Fetch API ile tan\u0131\u015fmak, web geli\u015ftirme becerilerinizi bir \u00fcst seviyeye ta\u015f\u0131man\u0131n ilk ad\u0131m\u0131d\u0131r.<\/p>\n<h3>Temel Fetch \u0130stekleri: GET ve POST<\/h3>\n<p>Fetch API&#8217;nin en s\u0131k kullan\u0131lan y\u00f6ntemleri GET ve POST&#8217;tur. Bir web uygulamas\u0131n\u0131n temel i\u015flevlerinden biri, sunucudan veri almak (GET) ve sunucuya veri g\u00f6ndermektir (POST). Fetch API ile bu i\u015flemleri nas\u0131l yapaca\u011f\u0131m\u0131za yak\u0131ndan bakal\u0131m.<\/p>\n<h4>GET \u0130stekleri ile Veri Alma<\/h4>\n<p>GET iste\u011fi, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, belirtilen kaynaktan veri almak i\u00e7in kullan\u0131l\u0131r. Genellikle bir URL&#8217;ye yap\u0131lan bir istektir ve sunucu bu iste\u011fe kar\u015f\u0131l\u0131k olarak istenen veriyi d\u00f6nd\u00fcr\u00fcr. Fetch API ile basit bir GET iste\u011fi yapmak olduk\u00e7a kolayd\u0131r. Varsay\u0131lan olarak, <code class=\"language-\">fetch()<\/code> fonksiyonu bir GET iste\u011fi yapar.<\/p>\n<p>\u00d6rne\u011fin, bir JSONPlaceholder API&#8217;sinden kullan\u0131c\u0131 bilgilerini almak istedi\u011fimizi varsayal\u0131m.<\/p>\n<pre class=\"language-html\"><code>&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;\nfetch('https:\/\/jsonplaceholder.typicode.com\/users\/1')\n  .then(response =&gt; {\n    \/\/ \u0130lk then blo\u011fu, iste\u011fin ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol eder.\n    \/\/ response.ok \u00f6zelli\u011fi true ise, durum kodu 200-299 aras\u0131ndad\u0131r.\n    if (!response.ok) {\n      throw new Error('A\u011f yan\u0131t\u0131 beklenen gibi de\u011fildi: ' + response.statusText);\n    }\n    \/\/ response.json() metodu, yan\u0131t g\u00f6vdesini JSON olarak ayr\u0131\u015ft\u0131r\u0131r ve bir Promise d\u00f6nd\u00fcr\u00fcr.\n    return response.json();\n  })\n  .then(data =&gt; {\n    \/\/ \u0130kinci then blo\u011fu, JSON verisi ba\u015far\u0131yla ayr\u0131\u015ft\u0131r\u0131ld\u0131ktan sonra \u00e7al\u0131\u015f\u0131r.\n    console.log('Kullan\u0131c\u0131 Bilgileri:', data);\n    \/\/ Burada al\u0131nan veriyi DOM'a ekleyebilir veya ba\u015fka i\u015flemler yapabilirsiniz.\n  })\n  .catch(error =&gt; {\n    \/\/ Herhangi bir hata olu\u015fursa (a\u011f hatas\u0131, ayr\u0131\u015ft\u0131rma hatas\u0131 vb.) bu blok \u00e7al\u0131\u015f\u0131r.\n    console.error('Fetch i\u015flemi s\u0131ras\u0131nda bir hata olu\u015ftu:', error);\n  });\n&lt;\/code&gt;&lt;\/pre&gt;<\/code><\/pre>\n<p>Yukar\u0131daki kodda, <code class=\"language-\">fetch()<\/code> fonksiyonuna istedi\u011fimiz URL&#8217;yi iletiyoruz. D\u00f6nd\u00fcr\u00fclen Promise&#8217;in ilk <code class=\"language-\">.then()<\/code> blo\u011fu, iste\u011fin ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. <code class=\"language-\">response.ok<\/code> \u00f6zelli\u011fi, HTTP durum kodunun ba\u015far\u0131l\u0131 aral\u0131kta (200-299) olup olmad\u0131\u011f\u0131n\u0131 belirtir. E\u011fer bir hata varsa, bir <code class=\"language-\">Error<\/code> f\u0131rlat\u0131r\u0131z. Ba\u015far\u0131l\u0131ysa, <code class=\"language-\">response.json()<\/code> metodunu \u00e7a\u011f\u0131rarak yan\u0131t g\u00f6vdesini JSON format\u0131nda ayr\u0131\u015ft\u0131r\u0131r\u0131z. Bu metot da bir Promise d\u00f6nd\u00fcr\u00fcr. \u0130kinci <code class=\"language-\">.then()<\/code> blo\u011fu, JSON verisi ba\u015far\u0131yla ayr\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda \u00e7al\u0131\u015f\u0131r ve bu veriye eri\u015fim sa\u011flar\u0131z. Son olarak, <code class=\"language-\">.catch()<\/code> blo\u011fu, istek s\u0131ras\u0131nda olu\u015fabilecek herhangi bir hatay\u0131 yakalamak i\u00e7in kullan\u0131l\u0131r. Bu, a\u011f ba\u011flant\u0131 sorunlar\u0131 veya sunucu hatalar\u0131 gibi durumlar\u0131 y\u00f6netmemize yard\u0131mc\u0131 olur.<\/p>\n<h4>POST \u0130stekleri ile Veri G\u00f6nderme<\/h4>\n<p>POST iste\u011fi, sunucuya veri g\u00f6ndermek i\u00e7in kullan\u0131l\u0131r. Bu, yeni bir kaynak olu\u015fturmak, mevcut bir kayna\u011f\u0131 g\u00fcncellemek veya bir i\u015flem ger\u00e7ekle\u015ftirmek gibi \u00e7e\u015fitli ama\u00e7larla yap\u0131labilir. POST iste\u011fi yaparken, <code class=\"language-\">fetch()<\/code> fonksiyonuna iste\u011fin konfig\u00fcrasyonunu i\u00e7eren ikinci bir arg\u00fcman (bir obje) ge\u00e7irmemiz gerekir. Bu obje i\u00e7inde <code class=\"language-\">method<\/code>, <code class=\"language-\">headers<\/code> ve <code class=\"language-\">body<\/code> gibi \u00f6zellikleri belirtebiliriz.<\/p>\n<p>\u00d6rne\u011fin, yeni bir kullan\u0131c\u0131 olu\u015fturmak i\u00e7in POST iste\u011fi yapal\u0131m.<\/p>\n<pre class=\"language-html\"><code>&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;\nconst newUser = {\n  name: 'Ahmet Y\u0131lmaz',\n  username: 'ahmetymz',\n  email: 'ahmet.yilmaz@example.com',\n  phone: '123-456-7890',\n  website: 'ahmet.com'\n};\n\nfetch('https:\/\/jsonplaceholder.typicode.com\/users', {\n  method: 'POST', \/\/ \u0130stek y\u00f6ntemini belirtiyoruz\n  headers: {\n    'Content-Type': 'application\/json' \/\/ G\u00f6nderdi\u011fimiz verinin JSON format\u0131nda oldu\u011funu belirtiyoruz\n  },\n  body: JSON.stringify(newUser) \/\/ JavaScript objesini JSON string'ine d\u00f6n\u00fc\u015ft\u00fcr\u00fcyoruz\n})\n  .then(response =&gt; {\n    if (!response.ok) {\n      throw new Error('A\u011f yan\u0131t\u0131 beklenen gibi de\u011fildi: ' + response.statusText);\n    }\n    return response.json(); \/\/ Genellikle POST istekleri de yan\u0131t olarak olu\u015fturulan veriyi d\u00f6nd\u00fcr\u00fcr\n  })\n  .then(data =&gt; {\n    console.log('Kullan\u0131c\u0131 ba\u015far\u0131yla olu\u015fturuldu:', data);\n  })\n  .catch(error =&gt; {\n    console.error('Kullan\u0131c\u0131 olu\u015fturma s\u0131ras\u0131nda bir hata olu\u015ftu:', error);\n  });\n&lt;\/code&gt;&lt;\/pre&gt;<\/code><\/pre>\n<p>Burada dikkat edilmesi gereken birka\u00e7 \u00f6nemli nokta var:<\/p>\n<p>*   <strong><code class=\"language-\">method: 'POST'<\/code><\/strong>: \u0130stek y\u00f6ntemini a\u00e7\u0131k\u00e7a &#8216;POST&#8217; olarak belirtiyoruz.<br \/>\n*   <strong><code class=\"language-\">headers: { 'Content-Type': 'application\/json' }<\/code><\/strong>: Sunucuya g\u00f6nderdi\u011fimiz verinin t\u00fcr\u00fcn\u00fc belirtiyoruz. Genellikle API&#8217;ler JSON format\u0131nda veri bekler.<br \/>\n*   <strong><code class=\"language-\">body: JSON.stringify(newUser)<\/code><\/strong>: G\u00f6nderece\u011fimiz JavaScript objesini <code class=\"language-\">JSON.stringify()<\/code> metodu ile JSON string&#8217;ine d\u00f6n\u00fc\u015ft\u00fcr\u00fcyoruz. Fetch API, <code class=\"language-\">body<\/code> \u00f6zelli\u011fine string veya <code class=\"language-\">FormData<\/code> gibi veri t\u00fcrleri alabilir.<\/p>\n<p>Sunucu, iste\u011fi ba\u015far\u0131yla i\u015fledi\u011finde genellikle olu\u015fturulan kayna\u011f\u0131n bilgilerini i\u00e7eren bir yan\u0131t d\u00f6nd\u00fcr\u00fcr. Bu yan\u0131t\u0131 da yine <code class=\"language-\">response.json()<\/code> ile al\u0131p i\u015fleyebiliriz. POST istekleri, kullan\u0131c\u0131 kay\u0131tlar\u0131, yorum g\u00f6nderme veya bir sipari\u015f verme gibi bir\u00e7ok senaryoda kullan\u0131l\u0131r.<\/p>\n<h3>Fetch API ile Hata Y\u00f6netimi ve Durum Kodlar\u0131<\/h3>\n<p>Web isteklerinde hata y\u00f6netimi, sa\u011flam ve g\u00fcvenilir uygulamalar geli\u015ftirmenin temel ta\u015flar\u0131ndan biridir. Fetch API, Promise tabanl\u0131 yap\u0131s\u0131 sayesinde hata y\u00f6netimini olduk\u00e7a kolayla\u015ft\u0131r\u0131r. Ancak, <code class=\"language-\">fetch()<\/code> fonksiyonunun kendisi sadece a\u011f ba\u011flant\u0131s\u0131 kesintileri gibi d\u00fc\u015f\u00fck seviyeli hatalar\u0131 yakalar. HTTP durum kodlar\u0131 (\u00f6rne\u011fin, 404 Not Found, 500 Internal Server Error) a\u011f iste\u011finin kendisi ba\u015far\u0131l\u0131 oldu\u011fu i\u00e7in <code class=\"language-\">fetch()<\/code> taraf\u0131ndan hata olarak alg\u0131lanmaz. Bu nedenle, bu t\u00fcr hatalar\u0131 kendimiz y\u00f6netmemiz gerekir.<\/p>\n<p>Yukar\u0131daki \u00f6rneklerde de g\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, <code class=\"language-\">response.ok<\/code> \u00f6zelli\u011fini kullanarak HTTP durum kodlar\u0131n\u0131n ba\u015far\u0131l\u0131 aral\u0131kta (200-299) olup olmad\u0131\u011f\u0131n\u0131 kontrol ediyoruz. E\u011fer <code class=\"language-\">response.ok<\/code> <code class=\"language-\">false<\/code> ise, bu genellikle bir istemci hatas\u0131 (4xx) veya sunucu hatas\u0131 (5xx) anlam\u0131na gelir. Bu durumda, durumu daha anla\u015f\u0131l\u0131r hale getirmek i\u00e7in \u00f6zel bir <code class=\"language-\">Error<\/code> nesnesi f\u0131rlatmak iyi bir pratiktir.<\/p>\n<pre class=\"language-html\"><code>&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;\nfetch('https:\/\/api.example.com\/veriler')\n  .then(response =&gt; {\n    if (!response.ok) {\n      \/\/ Durum kodunu ve metnini i\u00e7eren bir hata mesaj\u0131 olu\u015fturuyoruz.\n      \/\/ Bu, hata ay\u0131klamay\u0131 kolayla\u015ft\u0131r\u0131r.\n      throw new Error(<code class=\"language-\">HTTP hatas\u0131! Durum: ${response.status} ${response.statusText}<\/code>);\n    }\n    return response.json();\n  })\n  .then(data =&gt; {\n    console.log('Veriler al\u0131nd\u0131:', data);\n  })\n  .catch(error =&gt; {\n    \/\/ Buras\u0131 hem a\u011f hatalar\u0131n\u0131 hem de yukar\u0131da f\u0131rlatt\u0131\u011f\u0131m\u0131z HTTP hatalar\u0131n\u0131 yakalar.\n    console.error('Veri \u00e7ekme i\u015flemi ba\u015far\u0131s\u0131z oldu:', error.message);\n    \/\/ Kullan\u0131c\u0131ya anlaml\u0131 bir hata mesaj\u0131 g\u00f6sterebilirsiniz.\n    \/\/ \u00d6rne\u011fin: document.getElementById('hataMesaji').textContent = 'Veriler al\u0131namad\u0131, l\u00fctfen daha sonra tekrar deneyin.';\n  });\n&lt;\/code&gt;&lt;\/pre&gt;<\/code><\/pre>\n<p>Bu yakla\u015f\u0131m, hem a\u011f ba\u011flant\u0131s\u0131 kesintileri gibi beklenmedik durumlar\u0131 hem de sunucudan gelen belirli hata kodlar\u0131n\u0131 (404, 500 vb.) ayr\u0131 ayr\u0131 ele almam\u0131z\u0131 sa\u011flar. <code class=\"language-\">.catch()<\/code> blo\u011fu, Promise zincirindeki herhangi bir noktada meydana gelen t\u00fcm hatalar\u0131 yakalar. Bu, kodunuzu daha sa\u011flam hale getirir ve kullan\u0131c\u0131lar\u0131n\u0131za daha iyi bir deneyim sunman\u0131za yard\u0131mc\u0131 olur.<\/p>\n<p>Ayr\u0131ca, baz\u0131 API&#8217;ler kendi hata yap\u0131lar\u0131n\u0131 tan\u0131mlayabilir. \u00d6rne\u011fin, bir hata durumunda bile 200 OK d\u00f6nd\u00fcrebilir ve yan\u0131t g\u00f6vdesine bir hata mesaj\u0131 veya kodu ekleyebilir. Bu gibi durumlarda, <code class=\"language-\">response.json()<\/code> ile veriyi ald\u0131ktan sonra, verinin kendisi i\u00e7indeki bir \u00f6zelli\u011fi kontrol ederek hata durumunu belirlemeniz gerekebilir.<\/p>\n<pre class=\"language-html\"><code>&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;\nfetch('https:\/\/api.example.com\/islem')\n  .then(response =&gt; response.json()) \/\/ \u00d6nce JSON'a \u00e7eviriyoruz\n  .then(data =&gt; {\n    if (data.basarili) { \/\/ API'nin kendi hata kontrol\u00fc\n      console.log('\u0130\u015flem ba\u015far\u0131l\u0131:', data.sonuc);\n    } else {\n      \/\/ API'nin belirtti\u011fi hata mesaj\u0131n\u0131 kullan\u0131yoruz\n      throw new Error('API hatas\u0131: ' + data.mesaj);\n    }\n  })\n  .catch(error =&gt; {\n    console.error('\u0130\u015flem s\u0131ras\u0131nda hata olu\u015ftu:', error.message);\n  });\n&lt;\/code&gt;&lt;\/pre&gt;<\/code><\/pre>\n<p>Bu esneklik, Fetch API&#8217;yi farkl\u0131 API tasar\u0131mlar\u0131yla uyumlu hale getirir. \u00d6nemli olan, uygulaman\u0131z\u0131n ihtiya\u00e7lar\u0131na ve entegre oldu\u011funuz API&#8217;nin dok\u00fcmantasyonuna g\u00f6re uygun hata y\u00f6netimi stratejisini belirlemektir.<\/p>\n<h3>Fetch API ile Geli\u015fmi\u015f \u0130stekler: Headers, Mode, Credentials<\/h3>\n<p>Fetch API, temel GET ve POST isteklerinin \u00f6tesinde, daha karma\u015f\u0131k a\u011f ileti\u015fimi senaryolar\u0131 i\u00e7in de g\u00fc\u00e7l\u00fc se\u00e7enekler sunar. Bunlardan baz\u0131lar\u0131 <code class=\"language-\">headers<\/code>, <code class=\"language-\">mode<\/code> ve <code class=\"language-\">credentials<\/code> gibi yap\u0131land\u0131rma se\u00e7enekleridir. Bu se\u00e7enekler, isteklerimizi daha hassas bir \u015fekilde kontrol etmemizi sa\u011flar.<\/p>\n<h4>Headers (Ba\u015fl\u0131klar)<\/h4>\n<p>HTTP ba\u015fl\u0131klar\u0131, iste\u011fin veya yan\u0131t\u0131n i\u00e7eri\u011fi hakk\u0131nda ek bilgi ta\u015f\u0131r. \u00d6rne\u011fin, <code class=\"language-\">Content-Type<\/code> ba\u015fl\u0131\u011f\u0131, iste\u011fin g\u00f6vdesinin hangi formatta oldu\u011funu belirtir (\u00f6rne\u011fin, <code class=\"language-\">application\/json<\/code>). <code class=\"language-\">Authorization<\/code> ba\u015fl\u0131\u011f\u0131, kimlik do\u011frulama bilgilerini ta\u015f\u0131r. Fetch API ile ba\u015fl\u0131klar\u0131 <code class=\"language-\">headers<\/code> se\u00e7ene\u011fi arac\u0131l\u0131\u011f\u0131yla kolayca ayarlayabiliriz.<\/p>\n<pre class=\"language-html\"><code>&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;\nfetch('https:\/\/api.example.com\/protected-resource', {\n  method: 'GET',\n  headers: {\n    'Content-Type': 'application\/json',\n    'Authorization': 'Bearer YOUR_ACCESS_TOKEN', \/\/ API anahtar\u0131n\u0131z\u0131 veya token'\u0131n\u0131z\u0131 buraya ekleyin\n    'X-Custom-Header': 'MyValue' \/\/ \u00d6zel bir ba\u015fl\u0131k ekleme\n  }\n})\n  .then(response =&gt; {\n    if (!response.ok) {\n      throw new Error('Yetkilendirme hatas\u0131 veya ba\u015fka bir sorun.');\n    }\n    return response.json();\n  })\n  .then(data =&gt; {\n    console.log('Korunmu\u015f veriler:', data);\n  })\n  .catch(error =&gt; {\n    console.error('\u0130stek ba\u015far\u0131s\u0131z oldu:', error);\n  });\n&lt;\/code&gt;&lt;\/pre&gt;<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code class=\"language-\">Authorization<\/code> ba\u015fl\u0131\u011f\u0131 ile bir API anahtar\u0131n\u0131 veya bir OAuth token&#8217;\u0131n\u0131 g\u00f6nderiyoruz. <code class=\"language-\">X-Custom-Header<\/code> ise tamamen iste\u011fe ba\u011fl\u0131, kendi belirledi\u011fimiz bir ba\u015fl\u0131k \u00f6rne\u011fidir. Ba\u015fl\u0131klar, API&#8217;lerle etkile\u015fim kurarken kimlik do\u011frulama, i\u00e7erik t\u00fcr\u00fc belirtme veya \u00f6zel meta veriler iletme gibi bir\u00e7ok ama\u00e7la kullan\u0131l\u0131r.<\/p>\n<h4>Mode (Mod)<\/h4>\n<p><code class=\"language-\">mode<\/code> se\u00e7ene\u011fi, iste\u011fin nas\u0131l i\u015flenece\u011fini belirler. En yayg\u0131n de\u011feri <code class=\"language-\">cors<\/code>&#8216;tur (Cross-Origin Resource Sharing). Taray\u0131c\u0131lar, g\u00fcvenlik nedeniyle farkl\u0131 bir alan ad\u0131ndan (origin) gelen isteklere varsay\u0131lan olarak izin vermez. CORS, bu k\u0131s\u0131tlamay\u0131 a\u015fmak i\u00e7in bir mekanizmad\u0131r.<\/p>\n<p>*   <strong><code class=\"language-\">cors<\/code> (varsay\u0131lan)<\/strong>: Taray\u0131c\u0131, iste\u011fin CORS kurallar\u0131na uygun olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. E\u011fer sunucu uygun ba\u015fl\u0131klar\u0131 d\u00f6nd\u00fcrm\u00fcyorsa, istek ba\u015far\u0131s\u0131z olabilir.<br \/>\n*   <strong><code class=\"language-\">no-cors<\/code><\/strong>: Bu modda yap\u0131lan istekler, taray\u0131c\u0131 taraf\u0131ndan k\u0131s\u0131tlanmaz ancak yan\u0131t g\u00f6vdesine eri\u015filemez. Bu genellikle bir servis \u00e7al\u0131\u015ft\u0131r\u0131c\u0131s\u0131 (service worker) ile kullan\u0131l\u0131r.<br \/>\n*   <strong><code class=\"language-\">same-origin<\/code><\/strong>: \u0130stek sadece ayn\u0131 alan ad\u0131na yap\u0131ld\u0131\u011f\u0131nda ba\u015far\u0131l\u0131 olur. Farkl\u0131 bir alana yap\u0131l\u0131rsa hata verir.<\/p>\n<p>Genellikle, API&#8217;lerle \u00e7al\u0131\u015f\u0131rken <code class=\"language-\">mode<\/code>&#8216;u varsay\u0131lan (<code class=\"language-\">cors<\/code>) olarak b\u0131rak\u0131rs\u0131n\u0131z. E\u011fer bir CORS hatas\u0131 al\u0131yorsan\u0131z, bu genellikle sunucu taraf\u0131nda yap\u0131land\u0131r\u0131lmas\u0131 gereken bir sorundur.<\/p>\n<h4>Credentials (Kimlik Bilgileri)<\/h4>\n<p><code class=\"language-\">credentials<\/code> se\u00e7ene\u011fi, taray\u0131c\u0131n\u0131n istekle birlikte \u00e7erezleri (cookies) ve kimlik do\u011frulama ba\u015fl\u0131klar\u0131n\u0131 (Authorization) g\u00f6ndermesi gerekip gerekmedi\u011fini kontrol eder.<\/p>\n<p>*   <strong><code class=\"language-\">omit<\/code> (varsay\u0131lan)<\/strong>: Taray\u0131c\u0131, kimlik bilgileri g\u00f6ndermez.<br \/>\n*   <strong><code class=\"language-\">same-origin<\/code><\/strong>: Taray\u0131c\u0131, sadece istek ayn\u0131 alan ad\u0131na yap\u0131l\u0131yorsa kimlik bilgileri g\u00f6nderir.<br \/>\n*   <strong><code class=\"language-\">include<\/code><\/strong>: Taray\u0131c\u0131, istek ayn\u0131 alan ad\u0131na yap\u0131lmasa bile her zaman kimlik bilgileri g\u00f6nderir. Bu, \u00f6zellikle kimlik do\u011frulama gerektiren API&#8217;lerle \u00e7al\u0131\u015f\u0131rken kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<p>\u00d6rne\u011fin, oturum \u00e7erezlerini kullanarak bir API&#8217;ye eri\u015fmek istiyorsan\u0131z <code class=\"language-\">credentials: 'include'<\/code> kullanabilirsiniz.<\/p>\n<pre class=\"language-html\"><code>&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;\nfetch('https:\/\/api.example.com\/user-profile', {\n  method: 'GET',\n  credentials: 'include' \/\/ \u00c7erezleri de g\u00f6nderece\u011fimizi belirtiyoruz\n})\n  .then(response =&gt; {\n    if (!response.ok) {\n      throw new Error('Profil bilgileri al\u0131namad\u0131.');\n    }\n    return response.json();\n  })\n  .then(data =&gt; {\n    console.log('Kullan\u0131c\u0131 Profili:', data);\n  })\n  .catch(error =&gt; {\n    console.error('Profil alma hatas\u0131:', error);\n  });\n&lt;\/code&gt;&lt;\/pre&gt;<\/code><\/pre>\n<p>Bu geli\u015fmi\u015f se\u00e7enekler, Fetch API&#8217;yi daha karma\u015f\u0131k ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda kullanmam\u0131za olanak tan\u0131r. API&#8217;lerle entegrasyon yaparken bu se\u00e7enekleri do\u011fru anlamak, sorunsuz bir ileti\u015fim sa\u011flamak i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h3>Vaka Analizi: Bir Blog Uygulamas\u0131nda Fetch API Kullan\u0131m\u0131<\/h3>\n<p>\u015eimdi, Fetch API&#8217;yi ger\u00e7ek bir senaryoda, basit bir blog uygulamas\u0131 geli\u015ftirdi\u011fimizi d\u00fc\u015f\u00fcnerek nas\u0131l kullanabilece\u011fimizi inceleyelim. Bu blog uygulamas\u0131nda, makaleleri listeleyecek, tek bir makaleyi g\u00f6r\u00fcnt\u00fcleyecek ve yeni bir makale olu\u015fturabilece\u011fiz.<\/p>\n<h4>Senaryo 1: Makaleleri Listeleme (GET)<\/h4>\n<p>Kullan\u0131c\u0131 blog ana sayfas\u0131na geldi\u011finde, t\u00fcm makalelerin bir listesini g\u00f6rmelidir. Bu, bir GET iste\u011fi ile yap\u0131labilir.<\/p>\n<pre class=\"language-html\"><code>&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;\n\/\/ Makaleleri getiren fonksiyon\nfunction makaleleriGetir() {\n  const makaleListesiElementi = document.getElementById('makaleListesi');\n  makaleListesiElementi.innerHTML = 'Y\u00fckleniyor...'; \/\/ Y\u00fckleme g\u00f6stergesi\n\n  fetch('https:\/\/api.example.com\/articles') \/\/ Makalelerin bulundu\u011fu API u\u00e7 noktas\u0131\n    .then(response =&gt; {\n      if (!response.ok) {\n        throw new Error(<code class=\"language-\">Makaleler getirilemedi. Durum: ${response.status}<\/code>);\n      }\n      return response.json();\n    })\n    .then(makaleler =&gt; {\n      makaleListesiElementi.innerHTML = ''; \/\/ Y\u00fckleme g\u00f6stergesini temizle\n      if (makaleler.length === 0) {\n        makaleListesiElementi.innerHTML = '&lt;p&gt;Hen\u00fcz hi\u00e7 makale yok.&lt;\/p&gt;';\n        return;\n      }\n      makaleler.forEach(makale =&gt; {\n        const li = document.createElement('li');\n        li.innerHTML = <code class=\"language-\">\n          &lt;h3&gt;${makale.baslik}&lt;\/h3&gt;\n          &lt;p&gt;${makale.ozet}...&lt;\/p&gt;\n          &lt;a href=&quot;\/makale\/${makale.id}&quot;&gt;Devam\u0131n\u0131 Oku&lt;\/a&gt;\n        <\/code>;\n        makaleListesiElementi.appendChild(li);\n      });\n    })\n    .catch(error =&gt; {\n      console.error('Makale listesi \u00e7ekme hatas\u0131:', error);\n      makaleListesiElementi.innerHTML = <code class=\"language-\">&lt;p style=&quot;color: red;&quot;&gt;Makaleler y\u00fcklenirken bir hata olu\u015ftu: ${error.message}&lt;\/p&gt;<\/code>;\n    });\n}\n\n\/\/ Sayfa y\u00fcklendi\u011finde fonksiyonu \u00e7a\u011f\u0131r\ndocument.addEventListener('DOMContentLoaded', makaleleriGetir);\n&lt;\/code&gt;&lt;\/pre&gt;<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code class=\"language-\">makaleleriGetir<\/code> fonksiyonu, <code class=\"language-\">https:\/\/api.example.com\/articles<\/code> adresine bir GET iste\u011fi g\u00f6nderir. Yan\u0131t ba\u015far\u0131yla al\u0131nd\u0131\u011f\u0131nda, makaleler bir liste \u00f6\u011fesi olarak <code class=\"language-\">makaleListesiElementi<\/code> i\u00e7ine eklenir. Hata durumunda ise kullan\u0131c\u0131ya bir hata mesaj\u0131 g\u00f6sterilir.<\/p>\n<h4>Senaryo 2: Tek Bir Makaleyi G\u00f6r\u00fcnt\u00fcleme (GET)<\/h4>\n<p>Kullan\u0131c\u0131 bir makalenin ba\u015fl\u0131\u011f\u0131na t\u0131klad\u0131\u011f\u0131nda, o makalenin tam i\u00e7eri\u011fini g\u00f6r\u00fcnt\u00fclemek ister. Bu, makalenin ID&#8217;sini kullanarak ba\u015fka bir GET iste\u011fi ile yap\u0131l\u0131r.<\/p>\n<pre class=\"language-html\"><code>&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;\n\/\/ URL'den makale ID'sini alan ve makaleyi getiren fonksiyon\nfunction makaleGoster(makaleId) {\n  const makaleDetayElementi = document.getElementById('makaleDetay');\n  makaleDetayElementi.innerHTML = 'Makale y\u00fckleniyor...';\n\n  fetch(<code class=\"language-\">https:\/\/api.example.com\/articles\/${makaleId}<\/code>) \/\/ ID'ye g\u00f6re belirli makaleyi al\n    .then(response =&gt; {\n      if (!response.ok) {\n        if (response.status === 404) {\n          throw new Error('Bu makale bulunamad\u0131.');\n        }\n        throw new Error(<code class=\"language-\">Makale getirilemedi. Durum: ${response.status}<\/code>);\n      }\n      return response.json();\n    })\n    .then(makale =&gt; {\n      makaleDetayElementi.innerHTML = <code class=\"language-\">\n        &lt;h2&gt;${makale.baslik}&lt;\/h2&gt;\n        &lt;p&gt;Yazar: ${makale.yazar}&lt;\/p&gt;\n        &lt;p&gt;${makale.icerik}&lt;\/p&gt;\n      <\/code>;\n    })\n    .catch(error =&gt; {\n      console.error('Makale detaylar\u0131 \u00e7ekme hatas\u0131:', error);\n      makaleDetayElementi.innerHTML = <code class=\"language-\">&lt;p style=&quot;color: red;&quot;&gt;Makale y\u00fcklenirken bir hata olu\u015ftu: ${error.message}&lt;\/p&gt;<\/code>;\n    });\n}\n\n\/\/ Sayfa y\u00fcklendi\u011finde URL'den ID'yi al\u0131p fonksiyonu \u00e7a\u011f\u0131r\ndocument.addEventListener('DOMContentLoaded', () =&gt; {\n  const urlParcalari = window.location.pathname.split('\/');\n  const makaleId = urlParcalari[urlParcalari.length - 1]; \/\/ \u00d6rne\u011fin: \/makale\/123 -&gt; 123\n  if (makaleId) {\n    makaleGoster(makaleId);\n  } else {\n    document.getElementById('makaleDetay').innerHTML = '&lt;p&gt;L\u00fctfen ge\u00e7erli bir makale ID'si belirtin.&lt;\/p&gt;';\n  }\n});\n&lt;\/code&gt;&lt;\/pre&gt;<\/code><\/pre>\n<p>Bu senaryoda, URL&#8217;den dinamik olarak makale ID&#8217;sini al\u0131p (<code class=\"language-\">\/makale\/123<\/code> gibi), <code class=\"language-\">https:\/\/api.example.com\/articles\/123<\/code> adresine bir GET iste\u011fi g\u00f6nderiyoruz. 404 hatas\u0131 gibi \u00f6zel durumlar\u0131 da y\u00f6netiyoruz.<\/p>\n<h4>Senaryo 3: Yeni Bir Makale Olu\u015fturma (POST)<\/h4>\n<p>Kullan\u0131c\u0131 bir form arac\u0131l\u0131\u011f\u0131yla yeni bir makale yaz\u0131p g\u00f6nderdi\u011finde, bu veriyi sunucuya g\u00f6ndermemiz gerekir. Bu, bir POST iste\u011fi ile yap\u0131l\u0131r.<\/p>\n<pre class=\"language-html\"><code>&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;\nconst makaleFormu = document.getElementById('makaleFormu');\nconst baslikInput = document.getElementById('baslik');\nconst icerikTextarea = document.getElementById('icerik');\nconst mesajAlani = document.getElementById('formMesaji');\n\nmakaleFormu.addEventListener('submit', function(event) {\n  event.preventDefault(); \/\/ Formun varsay\u0131lan g\u00f6nderilmesini engelle\n\n  const yeniMakale = {\n    baslik: baslikInput.value,\n    icerik: icerikTextarea.value,\n    yazar: 'Anonim' \/\/ Varsay\u0131lan veya kullan\u0131c\u0131dan al\u0131nan yazar bilgisi\n  };\n\n  mesajAlani.textContent = 'Makale kaydediliyor...';\n\n  fetch('https:\/\/api.example.com\/articles', {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application\/json'\n    },\n    body: JSON.stringify(yeniMakale)\n  })\n    .then(response =&gt; {\n      if (!response.ok) {\n        throw new Error(<code class=\"language-\">Makale kaydedilemedi. Durum: ${response.status}<\/code>);\n      }\n      return response.json(); \/\/ Genellikle olu\u015fturulan makalenin bilgilerini d\u00f6nd\u00fcr\u00fcr\n    })\n    .then(olusturulanMakale =&gt; {\n      mesajAlani.textContent = 'Makale ba\u015far\u0131yla kaydedildi!';\n      baslikInput.value = ''; \/\/ Formu temizle\n      icerikTextarea.value = '';\n      \/\/ Kullan\u0131c\u0131y\u0131 yeni makalenin sayfas\u0131na y\u00f6nlendirebiliriz\n      \/\/ window.location.href = <code class=\"language-\">\/makale\/${olusturulanMakale.id}<\/code>;\n    })\n    .catch(error =&gt; {\n      console.error('Makale kaydetme hatas\u0131:', error);\n      mesajAlani.textContent = <code class=\"language-\">Hata: ${error.message}<\/code>;\n    });\n});\n&lt;\/code&gt;&lt;\/pre&gt;<\/code><\/pre>\n<p>Bu senaryoda, form g\u00f6nderildi\u011finde <code class=\"language-\">event.preventDefault()<\/code> ile varsay\u0131lan form g\u00f6nderimi engellenir. Ard\u0131ndan, formdaki veriler toplanarak bir JavaScript objesi olu\u015fturulur. Bu obje <code class=\"language-\">JSON.stringify()<\/code> ile string&#8217;e \u00e7evrilir ve <code class=\"language-\">POST<\/code> iste\u011fi ile API&#8217;ye g\u00f6nderilir. Ba\u015far\u0131l\u0131 oldu\u011funda, kullan\u0131c\u0131ya bir ba\u015far\u0131 mesaj\u0131 g\u00f6sterilir ve form temizlenir.<\/p>\n<p>Bu vaka analizi, Fetch API&#8217;nin bir web uygulamas\u0131n\u0131n temel i\u015flevlerini yerine getirmek i\u00e7in nas\u0131l kullan\u0131labilece\u011fini g\u00f6stermektedir. Veri alma, g\u00f6r\u00fcnt\u00fcleme ve g\u00f6nderme gibi i\u015flemler, Fetch API&#8217;nin temiz s\u00f6z dizimi ve Promise tabanl\u0131 yap\u0131s\u0131 sayesinde daha y\u00f6netilebilir hale gelir.<\/p>\n<h3>Fetch API ile Dosya Y\u00fckleme ve \u0130ndirme<\/h3>\n<p>Fetch API, sadece JSON veya metin verileriyle s\u0131n\u0131rl\u0131 de\u011fildir; ayn\u0131 zamanda dosya y\u00fckleme ve indirme gibi ikili (binary) veri i\u015flemleri i\u00e7in de kullan\u0131labilir. Bu, \u00f6zellikle kullan\u0131c\u0131lar\u0131n resim, belge veya di\u011fer dosyalar\u0131 uygulamalar\u0131n\u0131za y\u00fcklemesine veya sunucudan dosya indirmesine olanak tan\u0131yan \u00f6zellikler geli\u015ftirmek istedi\u011finizde \u00f6nemlidir.<\/p>\n<h4>Dosya Y\u00fckleme<\/h4>\n<p>Dosya y\u00fcklemek i\u00e7in genellikle <code class=\"language-\">FormData<\/code> nesnesi kullan\u0131l\u0131r. <code class=\"language-\">FormData<\/code>, HTML formlar\u0131ndaki verileri temsil eden bir yap\u0131d\u0131r ve dosya alanlar\u0131n\u0131 da i\u00e7erebilir.<\/p>\n<pre class=\"language-html\"><code>&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;\nconst dosyaYuklemeFormu = document.getElementById('dosyaYuklemeFormu');\nconst dosyaSecici = document.getElementById('dosyaSecici'); \/\/ &lt;input type=&quot;file&quot;&gt; elementi\n\ndosyaYuklemeFormu.addEventListener('submit', function(event) {\n  event.preventDefault();\n\n  const secilenDosya = dosyaSecici.files[0]; \/\/ Kullan\u0131c\u0131n\u0131n se\u00e7ti\u011fi ilk dosya\n\n  if (!secilenDosya) {\n    alert('L\u00fctfen y\u00fcklemek i\u00e7in bir dosya se\u00e7in.');\n    return;\n  }\n\n  const formData = new FormData();\n  formData.append('dosya', secilenDosya); \/\/ 'dosya' API'nin bekledi\u011fi alan ad\u0131 olmal\u0131\n\n  fetch('https:\/\/api.example.com\/upload', {\n    method: 'POST',\n    \/\/ 'Content-Type' ba\u015fl\u0131\u011f\u0131n\u0131 FormData ile otomatik olarak ayarlan\u0131r, bu y\u00fczden burada belirtmeye gerek yok.\n    body: formData\n  })\n    .then(response =&gt; {\n      if (!response.ok) {\n        throw new Error(<code class=\"language-\">Dosya y\u00fckleme ba\u015far\u0131s\u0131z. Durum: ${response.status}<\/code>);\n      }\n      return response.json(); \/\/ Sunucudan gelen yan\u0131t\u0131 i\u015fleyin\n    })\n    .then(data =&gt; {\n      console.log('Dosya ba\u015far\u0131yla y\u00fcklendi:', data);\n      alert('Dosya ba\u015far\u0131yla y\u00fcklendi!');\n    })\n    .catch(error =&gt; {\n      console.error('Dosya y\u00fckleme hatas\u0131:', error);\n      alert(<code class=\"language-\">Dosya y\u00fcklenirken bir hata olu\u015ftu: ${error.message}<\/code>);\n    });\n});\n&lt;\/code&gt;&lt;\/pre&gt;<\/code><\/pre>\n<p>Bu \u00f6rnekte, bir <code class=\"language-\"><input type=\"file\"><\/code> elementinden se\u00e7ilen dosya al\u0131n\u0131r. Ard\u0131ndan, bu dosya <code class=\"language-\">FormData<\/code> nesnesine eklenir ve <code class=\"language-\">fetch<\/code> iste\u011finin <code class=\"language-\">body<\/code>&#8216;si olarak g\u00f6nderilir. <code class=\"language-\">FormData<\/code> kullan\u0131ld\u0131\u011f\u0131nda, <code class=\"language-\">Content-Type<\/code> ba\u015fl\u0131\u011f\u0131n\u0131 manuel olarak ayarlaman\u0131za gerek yoktur; taray\u0131c\u0131 bunu sizin i\u00e7in do\u011fru \u015fekilde yapar (genellikle <code class=\"language-\">multipart\/form-data<\/code>).<\/p>\n<h4>Dosya \u0130ndirme<\/h4>\n<p>Sunucudan bir dosya indirmek i\u00e7in de Fetch API kullan\u0131labilir. Bu durumda, yan\u0131t\u0131n g\u00f6vdesini <code class=\"language-\">blob<\/code> olarak almam\u0131z ve ard\u0131ndan bunu bir URL&#8217;ye d\u00f6n\u00fc\u015ft\u00fcrmemiz gerekir.<\/p>\n<pre class=\"language-html\"><code>&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;\nfunction dosyayiIndir(url, dosyaAdi) {\n  fetch(url)\n    .then(response =&gt; {\n      if (!response.ok) {\n        throw new Error(<code class=\"language-\">Dosya indirilemedi. Durum: ${response.status}<\/code>);\n      }\n      \/\/ Yan\u0131t\u0131n i\u00e7eri\u011fini 'blob' olarak al\u0131yoruz\n      return response.blob();\n    })\n    .then(blob =&gt; {\n      \/\/ Blob'u bir URL'ye d\u00f6n\u00fc\u015ft\u00fcr\u00fcyoruz\n      const url = window.URL.createObjectURL(blob);\n      const a = document.createElement('a');\n      a.style.display = 'none';\n      a.href = url;\n      a.download = dosyaAdi; \/\/ \u0130ndirilecek dosyan\u0131n ad\u0131\n      document.body.appendChild(a);\n      a.click(); \/\/ Sahte bir t\u0131klama ile indirmeyi ba\u015flat\u0131yoruz\n      window.URL.revokeObjectURL(url); \/\/ Olu\u015fturulan URL'yi temizliyoruz\n      a.remove(); \/\/ Link elementini DOM'dan kald\u0131r\u0131yoruz\n      console.log('Dosya ba\u015far\u0131yla indirildi.');\n    })\n    .catch(error =&gt; {\n      console.error('Dosya indirme hatas\u0131:', error);\n      alert(<code class=\"language-\">Dosya indirilirken bir hata olu\u015ftu: ${error.message}<\/code>);\n    });\n}\n\n\/\/ \u00d6rnek kullan\u0131m:\n\/\/ dosyayiIndir('https:\/\/api.example.com\/files\/rapor.pdf', 'aylik_rapor.pdf');\n&lt;\/code&gt;&lt;\/pre&gt;<\/code><\/pre>\n<p>Bu fonksiyon, belirli bir URL&#8217;den bir dosyay\u0131 indirir. Yan\u0131t\u0131 <code class=\"language-\">response.blob()<\/code> ile al\u0131r, bu bir ikili veri nesnesidir. Ard\u0131ndan <code class=\"language-\">window.URL.createObjectURL()<\/code> ile bu blob&#8217;dan ge\u00e7ici bir URL olu\u015fturulur. Bu URL, bir <code class=\"language-\"><a><\/code> elementi arac\u0131l\u0131\u011f\u0131yla <code class=\"language-\">download<\/code> \u00f6zelli\u011fi ayarlanarak kullan\u0131l\u0131r. <code class=\"language-\">a.click()<\/code> ile kullan\u0131c\u0131 etkile\u015fimi olmadan indirme i\u015flemi tetiklenir. Son olarak, olu\u015fturulan URL&#8217;nin belle\u011fi serbest b\u0131rak\u0131l\u0131r (<code class=\"language-\">revokeObjectURL<\/code>).<\/p>\n<p>Fetch API ile dosya i\u015flemleri, modern web uygulamalar\u0131n\u0131n daha zengin i\u015flevsellikler sunmas\u0131na olanak tan\u0131r.<\/p>\n<h3>Fetch API ile \u0130leri D\u00fczey Teknikler ve \u0130pu\u00e7lar\u0131<\/h3>\n<p>Fetch API&#8217;nin temel kullan\u0131mlar\u0131n\u0131 ve dosya i\u015flemlerini ele ald\u0131k. \u015eimdi, daha deneyimli geli\u015ftiriciler i\u00e7in baz\u0131 ileri d\u00fczey tekniklere ve ipu\u00e7lar\u0131na g\u00f6z atal\u0131m.<\/p>\n<h4>AbortController ile \u0130stekleri \u0130ptal Etme<\/h4>\n<p>B\u00fcy\u00fck veya uzun s\u00fcren a\u011f isteklerini iptal etmek, kullan\u0131c\u0131 deneyimini iyile\u015ftirmek ve kaynaklar\u0131 verimli kullanmak i\u00e7in \u00f6nemlidir. <code class=\"language-\">AbortController<\/code> API&#8217;si ile bu m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<pre class=\"language-html\"><code>&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;\nlet controller = new AbortController();\nlet signal = controller.signal;\n\n\/\/ \u0130ste\u011fi ba\u015flat\nconst veriGetir = fetch('https:\/\/api.example.com\/long-operation', {\n  signal: signal \/\/ Sinyali iste\u011fe ba\u011fl\u0131yoruz\n})\n  .then(response =&gt; response.json())\n  .then(data =&gt; console.log('Uzun i\u015flem tamamland\u0131:', data))\n  .catch(error =&gt; {\n    if (error.name === 'AbortError') {\n      console.log('\u0130stek iptal edildi.');\n    } else {\n      console.error('\u0130stek s\u0131ras\u0131nda hata:', error);\n    }\n  });\n\n\/\/ Belirli bir ko\u015fulda iste\u011fi iptal et (\u00f6rne\u011fin, kullan\u0131c\u0131 ba\u015fka bir sayfaya ge\u00e7ti\u011finde)\nfunction istegiIptalEt() {\n  controller.abort(); \/\/ \u0130ste\u011fi iptal et\n}\n\n\/\/ \u00d6rnek: 10 saniye sonra iste\u011fi iptal et\nsetTimeout(() =&gt; {\n  istegiIptalEt();\n}, 10000);\n&lt;\/code&gt;&lt;\/pre&gt;<\/code><\/pre>\n<p><code class=\"language-\">AbortController<\/code> olu\u015fturulur, <code class=\"language-\">signal<\/code> \u00f6zelli\u011fi al\u0131n\u0131r ve <code class=\"language-\">fetch<\/code> iste\u011fine <code class=\"language-\">signal<\/code> olarak iletilir. <code class=\"language-\">controller.abort()<\/code> \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, ilgili istek iptal edilir ve <code class=\"language-\">catch<\/code> blo\u011funda <code class=\"language-\">AbortError<\/code> yakalan\u0131r. Bu, kullan\u0131c\u0131lar\u0131n bir i\u015flemden vazge\u00e7mesi veya uygulaman\u0131n gereksiz a\u011f trafi\u011fi \u00fcretmesini engellemek i\u00e7in harikad\u0131r.<\/p>\n<h4>Servis \u00c7al\u0131\u015ft\u0131r\u0131c\u0131lar\u0131 (Service Workers) ile Fetch \u0130steklerini Y\u00f6netme<\/h4>\n<p>Servis \u00e7al\u0131\u015ft\u0131r\u0131c\u0131lar\u0131, arka planda \u00e7al\u0131\u015fan ve a\u011f isteklerini yakalay\u0131p i\u015fleyebilen proxy&#8217;lerdir. Fetch API ile servis \u00e7al\u0131\u015ft\u0131r\u0131c\u0131lar\u0131 entegre edildi\u011finde, \u00e7evrimd\u0131\u015f\u0131 destek, \u00f6nbelle\u011fe alma (caching) ve arka plan senkronizasyonu gibi geli\u015fmi\u015f \u00f6zellikler sunulabilir.<\/p>\n<p>Bir servis \u00e7al\u0131\u015ft\u0131r\u0131c\u0131s\u0131nda, <code class=\"language-\">fetch<\/code> olay\u0131n\u0131 dinleyerek gelen istekleri yakalayabilir ve kendi yan\u0131tlar\u0131n\u0131z\u0131 d\u00f6nd\u00fcrebilir veya iste\u011fi orijinal hedefine y\u00f6nlendirebilirsiniz.<\/p>\n<pre class=\"language-html\"><code>&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;\n\/\/ service-worker.js dosyas\u0131ndan bir \u00f6rnek\n\nself.addEventListener('fetch', event =&gt; {\n  event.respondWith(\n    caches.match(event.request) \/\/ \u00d6nbellekte iste\u011fi ara\n      .then(response =&gt; {\n        \/\/ \u00d6nbellekte varsa, onu d\u00f6nd\u00fcr\n        if (response) {\n          return response;\n        }\n        \/\/ Yoksa, a\u011f\u0131 kullanarak iste\u011fi yap\n        return fetch(event.request).then(networkResponse =&gt; {\n          \/\/ A\u011f\u0131taki yan\u0131t\u0131 \u00f6nbelle\u011fe al\n          return caches.open('my-cache')\n            .then(cache =&gt; {\n              cache.put(event.request, networkResponse.clone());\n              return networkResponse;\n            });\n        });\n      })\n      .catch(error =&gt; {\n        console.error('Servis \u00e7al\u0131\u015ft\u0131r\u0131c\u0131 fetch hatas\u0131:', error);\n        \/\/ Hata durumunda alternatif bir yan\u0131t d\u00f6nd\u00fcr\n        return new Response('\u00c7evrimd\u0131\u015f\u0131', { status: 503, statusText: 'Service Unavailable' });\n      })\n  );\n});\n&lt;\/code&gt;&lt;\/pre&gt;<\/code><\/pre>\n<p>Bu \u00f6rnek, bir iste\u011fin \u00f6nce \u00f6nbellekte aranmas\u0131n\u0131, bulunamazsa a\u011fdan al\u0131nmas\u0131n\u0131 ve ard\u0131ndan \u00f6nbelle\u011fe kaydedilmesini g\u00f6sterir. Bu, uygulaman\u0131z\u0131n \u00e7evrimd\u0131\u015f\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 veya daha h\u0131zl\u0131 yan\u0131t vermesini sa\u011flayabilir.<\/p>\n<h4>Fetch API ile Timeout (Zaman A\u015f\u0131m\u0131) Uygulama<\/h4>\n<p>Fetch API&#8217;nin do\u011frudan bir <code class=\"language-\">timeout<\/code> se\u00e7ene\u011fi olmasa da, <code class=\"language-\">AbortController<\/code> ile bir zaman a\u015f\u0131m\u0131 mekanizmas\u0131 kolayca uygulanabilir.<\/p>\n<pre class=\"language-html\"><code>&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;\nfunction fetchWithTimeout(url, options = {}, timeout = 8000) { \/\/ Varsay\u0131lan zaman a\u015f\u0131m\u0131 8 saniye\n  let controller = new AbortController();\n  let signal = controller.signal;\n\n  const timeoutId = setTimeout(() =&gt; {\n    controller.abort();\n  }, timeout);\n\n  return fetch(url, {\n    ...options,\n    signal: signal\n  })\n    .then(response =&gt; {\n      clearTimeout(timeoutId); \/\/ \u0130stek ba\u015far\u0131l\u0131 olursa zamanlay\u0131c\u0131y\u0131 temizle\n      if (!response.ok) {\n        throw new Error(<code class=\"language-\">HTTP hatas\u0131! Durum: ${response.status}<\/code>);\n      }\n      return response.json();\n    })\n    .catch(error =&gt; {\n      clearTimeout(timeoutId); \/\/ Hata durumunda da zamanlay\u0131c\u0131y\u0131 temizle\n      if (error.name === 'AbortError') {\n        throw new Error(<code class=\"language-\">\u0130stek zaman a\u015f\u0131m\u0131na u\u011frad\u0131 (${timeout \/ 1000} saniye).<\/code>);\n      }\n      throw error; \/\/ Di\u011fer hatalar\u0131 yay\n    });\n}\n\n\/\/ Kullan\u0131m:\nfetchWithTimeout('https:\/\/api.example.com\/slow-data', {}, 5000) \/\/ 5 saniye zaman a\u015f\u0131m\u0131\n  .then(data =&gt; console.log('Veri al\u0131nd\u0131:', data))\n  .catch(error =&gt; console.error('\u0130\u015flem hatas\u0131:', error.message));\n&lt;\/code&gt;&lt;\/pre&gt;<\/code><\/pre>\n<p>Bu <code class=\"language-\">fetchWithTimeout<\/code> fonksiyonu, belirtilen s\u00fcre i\u00e7inde yan\u0131t gelmezse iste\u011fi iptal eder ve bir zaman a\u015f\u0131m\u0131 hatas\u0131 f\u0131rlat\u0131r. Bu, uygulamalar\u0131n\u0131z\u0131n yan\u0131t vermeyen sunuculara tak\u0131l\u0131p kalmas\u0131n\u0131 engeller.<\/p>\n<p>Bu ileri d\u00fczey teknikler, Fetch API&#8217;yi daha karma\u015f\u0131k ve performans odakl\u0131 uygulamalarda kullanman\u0131za olanak tan\u0131r.<\/p>\n<h3>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<p>JavaScript Fetch API, modern web geli\u015ftiricileri i\u00e7in a\u011f isteklerini y\u00f6netmenin g\u00fc\u00e7l\u00fc, esnek ve anla\u015f\u0131l\u0131r bir yolunu sunar. Basit GET ve POST isteklerinden dosya y\u00fckleme\/indirme gibi daha karma\u015f\u0131k senaryolara kadar geni\u015f bir kullan\u0131m alan\u0131na sahiptir. Promise tabanl\u0131 yap\u0131s\u0131, asenkron kodunuzu daha okunabilir ve y\u00f6netilebilir hale getirirken, <code class=\"language-\">AbortController<\/code> ve servis \u00e7al\u0131\u015ft\u0131r\u0131c\u0131lar\u0131 gibi \u00f6zellikler, uygulamalar\u0131n\u0131z\u0131n performans\u0131n\u0131 ve kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirmenize olanak tan\u0131r.<\/p>\n<p>Fetch API&#8217;yi etkin bir \u015fekilde kullanmak, RESTful API&#8217;lerle sorunsuz entegrasyon kurman\u0131z\u0131, dinamik i\u00e7erik y\u00fcklemenizi ve kullan\u0131c\u0131lar\u0131n\u0131za zengin, etkile\u015fimli deneyimler sunman\u0131z\u0131 sa\u011flar. Bu makalede ele ald\u0131\u011f\u0131m\u0131z temel kavramlar, \u00f6rnekler ve ileri d\u00fczey ipu\u00e7lar\u0131, Fetch API ile projelerinize ba\u015flaman\u0131z veya mevcut projelerinizi geli\u015ftirmeniz i\u00e7in sa\u011flam bir temel olu\u015fturacakt\u0131r.<\/p>\n<h4>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h4>\n<p>*   <strong>Fetch API ile <code class=\"language-\">XMLHttpRequest<\/code> aras\u0131ndaki temel farklar nelerdir?<\/strong><br \/>\n    Fetch API, Promise tabanl\u0131d\u0131r, bu da asenkron i\u015flemleri y\u00f6netmeyi daha kolay hale getirir. S\u00f6z dizimi daha basittir ve <code class=\"language-\">XMLHttpRequest<\/code>&#8216;in olay tabanl\u0131 yap\u0131s\u0131na g\u00f6re daha okunabilir bir kod sunar. Ayr\u0131ca, Fetch API daha mod\u00fcler bir yap\u0131ya sahiptir ve hata y\u00f6netimi daha standartt\u0131r.<\/p>\n<p>*   <strong>Fetch API t\u00fcm taray\u0131c\u0131larda destekleniyor mu?<\/strong><br \/>\n    Fetch API, modern taray\u0131c\u0131lar\u0131n b\u00fcy\u00fck \u00e7o\u011funlu\u011fu taraf\u0131ndan desteklenmektedir (Chrome, Firefox, Safari, Edge vb.). Ancak, Internet Explorer gibi eski taray\u0131c\u0131lar i\u00e7in polyfill&#8217;lere ihtiya\u00e7 duyulabilir. Genellikle, hedef kitlenizin kulland\u0131\u011f\u0131 taray\u0131c\u0131lar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurarak polyfill kullan\u0131p kullanmayaca\u011f\u0131n\u0131za karar verebilirsiniz.<\/p>\n<p>*   <strong>Fetch API ile PUT, DELETE gibi di\u011fer HTTP y\u00f6ntemlerini nas\u0131l kullanabilirim?<\/strong><br \/>\n    PUT, DELETE, PATCH gibi di\u011fer HTTP y\u00f6ntemlerini kullanmak i\u00e7in <code class=\"language-\">fetch()<\/code> fonksiyonuna ikinci arg\u00fcman olarak bir obje ge\u00e7irir ve <code class=\"language-\">method<\/code> \u00f6zelli\u011fini ilgili de\u011fere ayarlars\u0131n\u0131z. \u00d6rne\u011fin:<\/p>\n<pre class=\"language-html\"><code>&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;\n    fetch('\/api\/items\/123', {\n      method: 'PUT',\n      headers: { 'Content-Type': 'application\/json' },\n      body: JSON.stringify({ name: 'G\u00fcncellenmi\u015f \u00d6\u011fe' })\n    });\n    &lt;\/code&gt;&lt;\/pre&gt;<\/code><\/pre>\n<p>*   <strong>Fetch API ile nas\u0131l JSON verisi g\u00f6nderilir ve al\u0131n\u0131r?<\/strong><br \/>\n    JSON verisi g\u00f6ndermek i\u00e7in <code class=\"language-\">body<\/code> \u00f6zelli\u011fini <code class=\"language-\">JSON.stringify()<\/code> ile string&#8217;e d\u00f6n\u00fc\u015ft\u00fcr\u00fclm\u00fc\u015f bir JavaScript objesi olarak ayarlay\u0131n ve <code class=\"language-\">Content-Type: application\/json<\/code> ba\u015fl\u0131\u011f\u0131n\u0131 ekleyin. JSON verisi almak i\u00e7in ise <code class=\"language-\">response.json()<\/code> metodunu kullan\u0131n. Bu metot, yan\u0131t g\u00f6vdesini ayr\u0131\u015ft\u0131r\u0131r ve bir Promise d\u00f6nd\u00fcr\u00fcr.<\/p>\n<p>*   <strong>Fetch API iste\u011fim neden CORS hatas\u0131 veriyor?<\/strong><br \/>\n    CORS (Cross-Origin Resource Sharing) hatas\u0131, g\u00fcvenlik nedeniyle taray\u0131c\u0131n\u0131n farkl\u0131 bir alan ad\u0131ndan gelen isteklere izin vermemesinden kaynaklan\u0131r. Bu hatay\u0131 \u00e7\u00f6zmek i\u00e7in, sunucu taraf\u0131nda CORS ba\u015fl\u0131klar\u0131n\u0131n (\u00f6rne\u011fin, <code class=\"language-\">Access-Control-Allow-Origin<\/code>) do\u011fru \u015fekilde yap\u0131land\u0131r\u0131lmas\u0131 gerekir. Taray\u0131c\u0131, bu ba\u015fl\u0131klar\u0131 kontrol ederek iste\u011fin g\u00fcvenli olup olmad\u0131\u011f\u0131na karar verir.<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/fetch-api-simple-get-request\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/fetch-api-simple-get-request<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"JavaScript Fetch API: Modern Web \u0130stekleri Nas\u0131l Yap\u0131l\u0131r? G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131, sunucudan veri almak ve sunucuya veri g\u00f6ndermek&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[129],"tags":[],"class_list":{"0":"post-42682","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-javascript","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>JavaScript Fetch API: Modern Web \u0130stekleri Nas\u0131l Yap\u0131l\u0131r?<\/title>\n<meta name=\"description\" content=\"JavaScript Fetch API: Modern Web \u0130stekleri Nas\u0131l Yap\u0131l\u0131r? G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131, sunucudan veri almak ve sunucuya veri g\u00f6ndermek gibi bir\u00e7ok a\u011f ileti\u015fimini ger\u00e7ekle\u015ftirmek zorundad\u0131r.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JavaScript Fetch API: Modern Web \u0130stekleri Nas\u0131l Yap\u0131l\u0131r?\" \/>\n<meta property=\"og:description\" content=\"JavaScript Fetch API: Modern Web \u0130stekleri Nas\u0131l Yap\u0131l\u0131r? G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131, sunucudan veri almak ve sunucuya veri g\u00f6ndermek gibi bir\u00e7ok a\u011f ileti\u015fimini ger\u00e7ekle\u015ftirmek zorundad\u0131r.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-19T11:04:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-19T11:05:05+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"26 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"JavaScript Fetch API: Modern Web \u0130stekleri Nas\u0131l Yap\u0131l\u0131r?\",\"datePublished\":\"2026-06-19T11:04:25+00:00\",\"dateModified\":\"2026-06-19T11:05:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/\"},\"wordCount\":3225,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Javascript\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/\",\"name\":\"JavaScript Fetch API: Modern Web \u0130stekleri Nas\u0131l Yap\u0131l\u0131r?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-06-19T11:04:25+00:00\",\"dateModified\":\"2026-06-19T11:05:05+00:00\",\"description\":\"JavaScript Fetch API: Modern Web \u0130stekleri Nas\u0131l Yap\u0131l\u0131r? G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131, sunucudan veri almak ve sunucuya veri g\u00f6ndermek gibi bir\u00e7ok a\u011f ileti\u015fimini ger\u00e7ekle\u015ftirmek zorundad\u0131r.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JavaScript Fetch API: Modern Web \u0130stekleri Nas\u0131l Yap\u0131l\u0131r?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"JavaScript Fetch API: Modern Web \u0130stekleri Nas\u0131l Yap\u0131l\u0131r?","description":"JavaScript Fetch API: Modern Web \u0130stekleri Nas\u0131l Yap\u0131l\u0131r? G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131, sunucudan veri almak ve sunucuya veri g\u00f6ndermek gibi bir\u00e7ok a\u011f ileti\u015fimini ger\u00e7ekle\u015ftirmek zorundad\u0131r.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/","og_locale":"tr_TR","og_type":"article","og_title":"JavaScript Fetch API: Modern Web \u0130stekleri Nas\u0131l Yap\u0131l\u0131r?","og_description":"JavaScript Fetch API: Modern Web \u0130stekleri Nas\u0131l Yap\u0131l\u0131r? G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131, sunucudan veri almak ve sunucuya veri g\u00f6ndermek gibi bir\u00e7ok a\u011f ileti\u015fimini ger\u00e7ekle\u015ftirmek zorundad\u0131r.","og_url":"https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-06-19T11:04:25+00:00","article_modified_time":"2026-06-19T11:05:05+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"26 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"JavaScript Fetch API: Modern Web \u0130stekleri Nas\u0131l Yap\u0131l\u0131r?","datePublished":"2026-06-19T11:04:25+00:00","dateModified":"2026-06-19T11:05:05+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/"},"wordCount":3225,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Javascript"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/","url":"https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/","name":"JavaScript Fetch API: Modern Web \u0130stekleri Nas\u0131l Yap\u0131l\u0131r?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-06-19T11:04:25+00:00","dateModified":"2026-06-19T11:05:05+00:00","description":"JavaScript Fetch API: Modern Web \u0130stekleri Nas\u0131l Yap\u0131l\u0131r? G\u00fcn\u00fcm\u00fcz web uygulamalar\u0131, sunucudan veri almak ve sunucuya veri g\u00f6ndermek gibi bir\u00e7ok a\u011f ileti\u015fimini ger\u00e7ekle\u015ftirmek zorundad\u0131r.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/javascript-fetch-api-modern-web-istekleri-nasil-yapilir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"JavaScript Fetch API: Modern Web \u0130stekleri Nas\u0131l Yap\u0131l\u0131r?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42682","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=42682"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42682\/revisions"}],"predecessor-version":[{"id":42683,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/42682\/revisions\/42683"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=42682"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=42682"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=42682"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}