{"id":34846,"date":"2025-11-22T19:30:58","date_gmt":"2025-11-22T16:30:58","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/"},"modified":"2025-11-22T19:30:58","modified_gmt":"2025-11-22T16:30:58","slug":"node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/","title":{"rendered":"Node.js API Fetch \u00d6rne\u011fi: Ger\u00e7ek Verilerle Nas\u0131l \u00c7al\u0131\u015f\u0131l\u0131r?"},"content":{"rendered":"<p><body><\/p>\n<p>Modern web uygulamalar\u0131 geli\u015ftirirken, sunucu taraf\u0131nda d\u0131\u015f kaynaklardan veri \u00e7ekmek veya bu kaynaklara veri g\u00f6ndermek ka\u00e7\u0131n\u0131lmaz bir ihtiya\u00e7t\u0131r. Node.js, asenkron yap\u0131s\u0131 ve g\u00fc\u00e7l\u00fc ekosistemi sayesinde bu t\u00fcr API etkile\u015fimleri i\u00e7in ideal bir platform sunar. Bu makale, Node.js ortam\u0131nda Fetch API&#8217;yi ger\u00e7ek d\u00fcnya verileriyle nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayarak, hem yeni ba\u015flayanlar\u0131n hem de deneyimli geli\u015ftiricilerin bu konudaki bilgi birikimini art\u0131rmay\u0131 hedeflemektedir.<\/p>\n<p>Node.js ile API etkile\u015fimlerine dalmadan \u00f6nce, bu \u00fc\u00e7 temel kavram\u0131 netle\u015ftirmekte fayda var. Sonu\u00e7ta, bir binan\u0131n temelini anlamadan katlar\u0131n\u0131 in\u015fa etmek pek de ak\u0131ll\u0131ca olmaz, de\u011fil mi?<\/p>\n<h3>Node.js Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p>Node.js, Google&#8217;\u0131n V8 JavaScript motoru \u00fczerine kurulu, sunucu taraf\u0131nda JavaScript \u00e7al\u0131\u015ft\u0131rman\u0131za olanak tan\u0131yan a\u00e7\u0131k kaynakl\u0131, \u00e7al\u0131\u015fma zaman\u0131 bir ortamd\u0131r. Geleneksel olarak JavaScript sadece taray\u0131c\u0131da \u00e7al\u0131\u015f\u0131rken, Node.js bu s\u0131n\u0131r\u0131 kald\u0131rarak geli\u015ftiricilere tek bir dil (JavaScript) ile hem \u00f6n y\u00fcz\u00fc hem de arka y\u00fcz\u00fc geli\u015ftirme imkan\u0131 sunar. Bu durum, \u00f6zellikle tam y\u0131\u011f\u0131n (full-stack) geli\u015ftiriciler i\u00e7in b\u00fcy\u00fck bir kolayl\u0131k ve verimlilik art\u0131\u015f\u0131 demektir. Node.js&#8217;in en \u00f6nemli \u00f6zelliklerinden biri, olay tabanl\u0131 (event-driven) ve bloklamayan (non-blocking) G\/\u00c7 (Input\/Output) modelidir. Bu sayede, ayn\u0131 anda binlerce ba\u011flant\u0131y\u0131 verimli bir \u015fekilde y\u00f6netebilir, bu da onu y\u00fcksek performansl\u0131 ve \u00f6l\u00e7eklenebilir a\u011f uygulamalar\u0131 i\u00e7in m\u00fckemmel bir se\u00e7im haline getirir. \u00d6rne\u011fin, bir web sunucusu d\u00fc\u015f\u00fcn\u00fcn; Node.js, bir iste\u011fi i\u015flerken di\u011ferlerini bekletmek yerine, t\u00fcm istekleri e\u015f zamanl\u0131 olarak dinleyebilir ve her biri i\u00e7in uygun oldu\u011funda yan\u0131t verebilir. Bu asenkron yap\u0131, \u00f6zellikle a\u011f istekleri gibi zaman al\u0131c\u0131 i\u015flemler i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h3>API Nedir ve Uygulama Geli\u015ftirmedeki Rol\u00fc?<\/h3>\n<p>API (Application Programming Interface), farkl\u0131 yaz\u0131l\u0131m sistemlerinin birbiriyle ileti\u015fim kurmas\u0131n\u0131 sa\u011flayan kurallar ve protokoller b\u00fct\u00fcn\u00fcd\u00fcr. Basit\u00e7e ifade etmek gerekirse, bir API, iki uygulaman\u0131n &#8220;konu\u015fmas\u0131&#8221; i\u00e7in bir k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr. \u00d6rne\u011fin, bir mobil uygulama hava durumu verilerini g\u00f6stermek istedi\u011finde, do\u011frudan hava durumu sens\u00f6rlerine eri\u015femez. Bunun yerine, bir hava durumu servisinin API&#8217;sini kullanarak bu bilgilere eri\u015fir. G\u00fcn\u00fcm\u00fczde en yayg\u0131n API t\u00fcrlerinden biri REST (Representational State Transfer) API&#8217;dir. REST API&#8217;leri, HTTP protokol\u00fcn\u00fc kullanarak veri al\u0131\u015fveri\u015fi yapar ve kaynaklar\u0131 URL&#8217;ler arac\u0131l\u0131\u011f\u0131yla temsil eder. Temel HTTP metotlar\u0131 olan GET (veri alma), POST (veri g\u00f6nderme), PUT (veri g\u00fcncelleme) ve DELETE (veri silme) bu etkile\u015fimin omurgas\u0131n\u0131 olu\u015fturur. Bir API&#8217;yi do\u011fru bir \u015fekilde anlamak ve kullanmak, modern yaz\u0131l\u0131m mimarisinde mod\u00fclerlik, esneklik ve yeniden kullan\u0131labilirlik a\u00e7\u0131s\u0131ndan hayati \u00f6nem ta\u015f\u0131r. Bir\u00e7ok \u015firket, kendi verilerini veya hizmetlerini \u00fc\u00e7\u00fcnc\u00fc taraf geli\u015ftiricilere a\u00e7mak i\u00e7in API&#8217;ler sunar, bu da inovasyonu ve entegrasyonu te\u015fvik eder.<\/p>\n<h3>Fetch API: Modern HTTP \u0130stek Y\u00f6netimi<\/h3>\n<p>Fetch API, web taray\u0131c\u0131lar\u0131nda HTTP istekleri yapmak i\u00e7in modern ve g\u00fc\u00e7l\u00fc bir aray\u00fczd\u00fcr. Geleneksel XMLHttpRequest (XHR) y\u00f6ntemine k\u0131yasla daha esnek, vaat (Promise) tabanl\u0131 bir yap\u0131 sunar. Bu, asenkron i\u015flemleri y\u00f6netmeyi \u00e7ok daha kolay ve okunabilir hale getirir. Taray\u0131c\u0131larda do\u011fal olarak bulunan Fetch API, Node.js ortam\u0131nda do\u011frudan yerle\u015fik de\u011fildir. Ancak endi\u015felenmeyin! Node.js toplulu\u011fu bu eksikli\u011fi gidermek i\u00e7in <code class=\"language-javascript\">node-fetch<\/code> gibi k\u00fct\u00fcphaneler geli\u015ftirmi\u015ftir. <code class=\"language-javascript\">node-fetch<\/code>, taray\u0131c\u0131daki Fetch API ile neredeyse ayn\u0131 aray\u00fcze sahip olup, Node.js projelerinizde d\u0131\u015f API&#8217;lerle etkile\u015fim kurman\u0131z\u0131 sa\u011flar. Vaat tabanl\u0131 yap\u0131s\u0131 sayesinde, bir API iste\u011fi g\u00f6nderdi\u011finizde, yan\u0131t\u0131n gelmesini beklerken uygulaman\u0131z\u0131n di\u011fer k\u0131s\u0131mlar\u0131n\u0131n \u00e7al\u0131\u015fmaya devam etmesini sa\u011flar. Bu asenkron do\u011fa, \u00f6zellikle kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir, \u00e7\u00fcnk\u00fc uzun s\u00fcren bir a\u011f iste\u011fi t\u00fcm uygulaman\u0131z\u0131 kilitlemez. <code class=\"language-javascript\">async\/await<\/code> s\u00f6z dizimi ile birle\u015fti\u011finde ise, asenkron kod yazmak adeta senkron kod yazmak kadar do\u011fal ve anla\u015f\u0131l\u0131r bir hale gelir.<\/p>\n<h2>Node.js Ortam\u0131nda API \u00c7a\u011fr\u0131s\u0131 Nas\u0131l Yap\u0131l\u0131r? \u0130lk Ad\u0131mlar<\/h2>\n<p>\u015eimdi teorik bilgileri prati\u011fe d\u00f6kmeye haz\u0131r\u0131z. Node.js projenizde d\u0131\u015f bir API&#8217;den veri \u00e7ekmek i\u00e7in izlemeniz gereken ad\u0131mlar olduk\u00e7a basittir. Bu b\u00f6l\u00fcmde, projenizi nas\u0131l kuraca\u011f\u0131n\u0131z\u0131, <code class=\"language-javascript\">node-fetch<\/code> k\u00fct\u00fcphanesini nas\u0131l ekleyece\u011finizi ve basit bir GET iste\u011fiyle ilk API \u00e7a\u011fr\u0131n\u0131z\u0131 nas\u0131l yapaca\u011f\u0131n\u0131z\u0131 anlataca\u011f\u0131z.<\/p>\n<h3>Node.js Projesini Ba\u015flatma ve Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Kurma<\/h3>\n<p>Her \u015feyden \u00f6nce, yeni bir Node.js projesi ba\u015flatmam\u0131z gerekiyor. Bunun i\u00e7in terminalinizde veya komut istemcinizde yeni bir klas\u00f6r olu\u015fturun ve i\u00e7ine girin:<\/p>\n<pre><code class=\"language-bash\">\nmkdir nodejs-fetch-ornek\ncd nodejs-fetch-ornek\n<\/pre>\n<p><\/code><\/p>\n<p>Ard\u0131ndan, <code class=\"language-bash\">npm init -y<\/code> komutuyla yeni bir <code class=\"language-json\">package.json<\/code> dosyas\u0131 olu\u015fturun. <code class=\"language-bash\">-y<\/code> bayra\u011f\u0131, t\u00fcm sorulara varsay\u0131lan yan\u0131tlar\u0131 vermenizi sa\u011flar, bu da s\u00fcreci h\u0131zland\u0131r\u0131r:<\/p>\n<pre><code class=\"language-bash\">\nnpm init -y\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi, Node.js ortam\u0131nda Fetch API'sini kullanmam\u0131z\u0131 sa\u011flayacak olan <code class=\"language-javascript\">node-fetch<\/code> k\u00fct\u00fcphanesini kurmal\u0131y\u0131z:<\/p>\n<pre><code class=\"language-bash\">\nnpm install node-fetch@2 # node-fetch v3 ve \u00fczeri sadece ES Mod\u00fclleri ile \u00e7al\u0131\u015f\u0131r, v2 yayg\u0131n kullan\u0131m i\u00e7in daha uygun.\n<\/pre>\n<p><\/code><\/p>\n<p>Kurulum tamamland\u0131\u011f\u0131nda, <code class=\"language-json\">package.json<\/code> dosyan\u0131zda <code class=\"language-javascript\">\"node-fetch\": \"^2.6.7\"<\/code> gibi bir girdi g\u00f6receksiniz. Bu, k\u00fct\u00fcphanenin ba\u015far\u0131yla kuruldu\u011funu g\u00f6sterir.<\/p>\n<h3>Basit Bir GET \u0130ste\u011fi Yapma: JSONPlaceholder \u00d6rne\u011fi<\/h3>\n<p>\u0130lk API \u00e7a\u011fr\u0131m\u0131z\u0131 yapmak i\u00e7in pop\u00fcler bir sahte REST API servisi olan JSONPlaceholder'\u0131 kullanaca\u011f\u0131z. Bu servis, test ve prototipleme ama\u00e7lar\u0131 i\u00e7in sahte veriler sunar. \u00d6rne\u011fin, <code class=\"language-http\">https:\/\/jsonplaceholder.typicode.com\/posts\/1<\/code> adresinden bir g\u00f6nderi \u00e7ekebiliriz.<\/p>\n<p>Proje klas\u00f6r\u00fcn\u00fczde <code class=\"language-javascript\">app.js<\/code> ad\u0131nda yeni bir dosya olu\u015fturun ve a\u015fa\u011f\u0131daki kodu i\u00e7ine yap\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-javascript\">\nconst fetch = require('node-fetch'); \/\/ node-fetch v2 i\u00e7in require kullan\u0131l\u0131r\n\nasync function getSinglePost() {\n  try {\n    const response = await fetch('https:\/\/jsonplaceholder.typicode.com\/posts\/1');\n\n    if (!response.ok) { \/\/ HTTP yan\u0131t\u0131n\u0131n ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol edin (\u00f6rn. 200 OK)\n      throw new Error(<code>HTTP Hata kodu: ${response.status}<\/code>);\n    }\n\n    const data = await response.json(); \/\/ Yan\u0131t\u0131 JSON format\u0131nda ayr\u0131\u015ft\u0131r\u0131n\n    console.log('Ba\u015far\u0131yla \u00e7ekilen veri:', data);\n  } catch (error) {\n    console.error('Veri \u00e7ekilirken bir hata olu\u015ftu:', error);\n  }\n}\n\ngetSinglePost();\n<\/pre>\n<p><\/code><\/p>\n<p>Bu kod blo\u011fu, <code class=\"language-javascript\">async\/await<\/code> s\u00f6z dizimini kullanarak asenkron bir i\u015flemi nas\u0131l y\u00f6netece\u011fimizi g\u00f6sterir. <code class=\"language-javascript\">fetch<\/code> fonksiyonu bir Promise d\u00f6nd\u00fcr\u00fcr, <code class=\"language-javascript\">await<\/code> anahtar kelimesi ise Promise'in \u00e7\u00f6z\u00fclmesini bekler ve de\u011feri d\u00f6ner. \u0130lk <code class=\"language-javascript\">await fetch(...)<\/code> sat\u0131r\u0131, API'ye iste\u011fi g\u00f6nderir ve yan\u0131t (response) nesnesini bekler. Ard\u0131ndan, <code class=\"language-javascript\">response.json()<\/code> metodu yan\u0131t g\u00f6vdesini JSON olarak ayr\u0131\u015ft\u0131r\u0131r ve bu da bir Promise d\u00f6nd\u00fcrd\u00fc\u011f\u00fc i\u00e7in tekrar <code class=\"language-javascript\">await<\/code> ile bekleriz. <code class=\"language-javascript\">try...catch<\/code> blo\u011fu, a\u011f hatalar\u0131 veya API'den gelen ba\u015far\u0131s\u0131z yan\u0131tlar gibi olas\u0131 hatalar\u0131 yakalamak i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p>Bu kodu \u00e7al\u0131\u015ft\u0131rmak i\u00e7in terminalinizde a\u015fa\u011f\u0131daki komutu kullan\u0131n:<\/p>\n<pre><code class=\"language-bash\">\nnode app.js\n<\/pre>\n<p><\/code><\/p>\n<p>\u00c7\u0131kt\u0131da, JSONPlaceholder'dan gelen ilk g\u00f6nderinin detaylar\u0131n\u0131 g\u00f6rmelisiniz. Bu, ilk ba\u015far\u0131l\u0131 Node.js API \u00e7a\u011fr\u0131n\u0131zd\u0131r!<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: <code class=\"language-javascript\">node-fetch<\/code>'in 3. s\u00fcr\u00fcm\u00fc ve \u00fczeri sadece ES Mod\u00fclleri (ESM) ile uyumludur. E\u011fer Node.js projenizde <code class=\"language-javascript\">type: \"module\"<\/code> tan\u0131mlamas\u0131 yapt\u0131ysan\u0131z, <code class=\"language-javascript\">import fetch from 'node-fetch';<\/code> \u015feklinde kullanman\u0131z gerekir. Eski CommonJS mod\u00fcl yap\u0131s\u0131nda (yani <code class=\"language-json\">package.json<\/code> dosyan\u0131zda <code class=\"language-javascript\">\"type\": \"module\"<\/code> yoksa) <code class=\"language-javascript\">const fetch = require('node-fetch');<\/code> kullanmak i\u00e7in <code class=\"language-javascript\">node-fetch@2<\/code> kurman\u0131z \u00f6nerilir.\n<\/div>\n<h2>Ger\u00e7ek D\u00fcnya Verileriyle \u00c7al\u0131\u015fmak: Bir Vaka Analizi<\/h2>\n<p>\u015eimdiye kadar temel bir API \u00e7a\u011fr\u0131s\u0131 yapmay\u0131 \u00f6\u011frendik. Ancak ger\u00e7ek d\u00fcnya senaryolar\u0131 genellikle daha karma\u015f\u0131k ve spesifik ihtiya\u00e7lar i\u00e7erir. Bu b\u00f6l\u00fcmde, ger\u00e7ek bir API kullanarak hava durumu verisi \u00e7ekme \u00f6rne\u011fi \u00fczerinden, API'lerle nas\u0131l daha etkili \u00e7al\u0131\u015f\u0131laca\u011f\u0131n\u0131, parametre y\u00f6netimini ve elde edilen verinin nas\u0131l i\u015flenece\u011fini detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h3>\u00d6rnek Senaryo: Bir \u015eehrin Hava Durumu Bilgilerini \u00c7ekme<\/h3>\n<p>Hava durumu uygulamalar\u0131, d\u0131\u015f API'lerle etkile\u015fimin en yayg\u0131n \u00f6rneklerinden biridir. OpenWeatherMap gibi servisler, co\u011frafi konuma veya \u015fehir ad\u0131na g\u00f6re g\u00fcncel hava durumu verilerini sunar. Bu \u00f6rne\u011fimizde, belirli bir \u015fehrin mevcut hava durumu bilgilerini \u00e7ekece\u011fiz. Bu i\u015flem, genellikle API anahtar\u0131 gerektiren kimlik do\u011frulama, sorgu parametreleri olu\u015fturma ve al\u0131nan veriyi anlaml\u0131 bir \u015fekilde ayr\u0131\u015ft\u0131rma ad\u0131mlar\u0131n\u0131 i\u00e7erir.<\/p>\n<h4>Ad\u0131m 1: API Anahtar\u0131 Edinme ve Temel Kurulum<\/h4>\n<p>OpenWeatherMap gibi bir\u00e7ok ger\u00e7ek d\u00fcnya API'si, istekleri kimlik do\u011frulamak ve k\u00f6t\u00fcye kullan\u0131m\u0131 \u00f6nlemek i\u00e7in bir API anahtar\u0131 (API Key) gerektirir. OpenWeatherMap web sitesine kaydolduktan sonra \u00fccretsiz bir API anahtar\u0131 edinebilirsiniz. Bu anahtar\u0131, isteklerinizle birlikte g\u00f6ndermeniz gerekecektir.<\/p>\n<p>API anahtar\u0131n\u0131z\u0131 do\u011frudan kodunuzun i\u00e7ine yazmak yerine, g\u00fcvenlik ve esneklik a\u00e7\u0131s\u0131ndan ortam de\u011fi\u015fkenleri (environment variables) kullanmak en iyi pratiktir. Bunun i\u00e7in <code class=\"language-javascript\">dotenv<\/code> k\u00fct\u00fcphanesini kullanabiliriz:<\/p>\n<pre><code class=\"language-bash\">\nnpm install dotenv\n<\/pre>\n<p><\/code><\/p>\n<p>Projenizin ana dizininde <code class=\"language-text\">.env<\/code> ad\u0131nda bir dosya olu\u015fturun ve API anahtar\u0131n\u0131z\u0131 a\u015fa\u011f\u0131daki gibi ekleyin:<\/p>\n<pre><code class=\"language-text\">\nOPENWEATHER_API_KEY=sizin_open_weather_api_anahtariniz\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi, <code class=\"language-javascript\">app.js<\/code> dosyan\u0131z\u0131n en \u00fcst\u00fcne <code class=\"language-javascript\">dotenv<\/code>'i y\u00fckleyin:<\/p>\n<pre><code class=\"language-javascript\">\nrequire('dotenv').config(); \/\/ Ortam de\u011fi\u015fkenlerini y\u00fckle\nconst fetch = require('node-fetch'); \/\/ node-fetch v2 i\u00e7in\n\nconst API_KEY = process.env.OPENWEATHER_API_KEY; \/\/ .env dosyas\u0131ndan anahtar\u0131 al\nconst BASE_URL = 'http:\/\/api.openweathermap.org\/data\/2.5\/weather';\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131 sayesinde, API anahtar\u0131n\u0131z kod taban\u0131n\u0131zdan ayr\u0131 tutulur ve versiyon kontrol sistemlerine (\u00f6rn. Git) yanl\u0131\u015fl\u0131kla y\u00fcklenmesi \u00f6nlenir. Ayr\u0131ca, farkl\u0131 ortamlar (geli\u015ftirme, \u00fcretim) i\u00e7in farkl\u0131 anahtarlar kullanman\u0131z\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<h4>Ad\u0131m 2: Parametreli GET \u0130ste\u011fi Yapma ve Veriyi \u0130\u015fleme<\/h4>\n<p>OpenWeatherMap API'sinden bir \u015fehrin hava durumunu \u00e7ekmek i\u00e7in genellikle \u015fehrin ad\u0131n\u0131 ve API anahtar\u0131n\u0131 sorgu parametreleri olarak g\u00f6ndermemiz gerekir. URL'yi do\u011fru bir \u015fekilde olu\u015fturmak \u00f6nemlidir.<\/p>\n<p>A\u015fa\u011f\u0131daki kodu <code class=\"language-javascript\">app.js<\/code> dosyan\u0131za ekleyin:<\/p>\n<pre><code class=\"language-javascript\">\nasync function getWeather(city) {\n  if (!API_KEY) {\n    console.error('Hata: OPENWEATHER_API_KEY ortam de\u011fi\u015fkeni ayarlanmam\u0131\u015f.');\n    return;\n  }\n\n  const url = <code>${BASE_URL}?q=${city}&appid=${API_KEY}&units=metric&lang=tr<\/code>; \/\/ Celsius ve T\u00fcrk\u00e7e dil deste\u011fi\n  \n  try {\n    console.log(<code>\"${city}\" i\u00e7in hava durumu verileri \u00e7ekiliyor...<\/code>);\n    const response = await fetch(url);\n\n    if (!response.ok) {\n      \/\/ API'den gelen spesifik hata mesajlar\u0131n\u0131 da yakalayabiliriz\n      const errorData = await response.json();\n      throw new Error(<code>API hatas\u0131: ${response.status} - ${errorData.message || &#039;Bilinmeyen Hata&#039;}<\/code>);\n    }\n\n    const data = await response.json();\n    displayWeather(data); \/\/ Veriyi ekrana bast\u0131ran yard\u0131mc\u0131 fonksiyon\n  } catch (error) {\n    console.error('Hava durumu verisi \u00e7ekilirken bir hata olu\u015ftu:', error.message);\n  }\n}\n\nfunction displayWeather(weatherData) {\n  if (!weatherData || weatherData.cod === '404') {\n    console.log('Belirtilen \u015fehir bulunamad\u0131.');\n    return;\n  }\n\n  const cityName = weatherData.name;\n  const country = weatherData.sys.country;\n  const temperature = weatherData.main.temp;\n  const description = weatherData.weather[0].description;\n  const humidity = weatherData.main.humidity;\n  const windSpeed = weatherData.wind.speed;\n\n  console.log(<code>\\n\u015eehir: ${cityName}, ${country}<\/code>);\n  console.log(<code>S\u0131cakl\u0131k: ${temperature}\u00b0C<\/code>);\n  console.log(<code>Durum: ${description}<\/code>);\n  console.log(<code>Nem Oran\u0131: %${humidity}<\/code>);\n  console.log(<code>R\u00fczgar H\u0131z\u0131: ${windSpeed} m\/s<\/code>);\n}\n\n\/\/ Hava durumu bilgisini almak istedi\u011finiz \u015fehri belirtin\ngetWeather('Istanbul'); \/\/ \u00d6rne\u011fin \u0130stanbul i\u00e7in hava durumu\ngetWeather('London'); \/\/ Farkl\u0131 bir \u015fehir i\u00e7in\ngetWeather('NonExistentCity'); \/\/ Olmayan bir \u015fehir i\u00e7in hata y\u00f6netimi\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code class=\"language-javascript\">getWeather<\/code> fonksiyonu, dinamik olarak bir \u015fehir ad\u0131 al\u0131r ve bu ismi URL'ye ekler. Ayr\u0131ca <code class=\"language-javascript\">units=metric<\/code> ile s\u0131cakl\u0131k birimini Celsius olarak, <code class=\"language-javascript\">lang=tr<\/code> ile de yan\u0131t dilini T\u00fcrk\u00e7e olarak belirtiyoruz. <code class=\"language-javascript\">displayWeather<\/code> fonksiyonu, \u00e7ekilen JSON verisini daha okunabilir bir formatta konsola basar. \u00d6zellikle <code class=\"language-javascript\">response.ok<\/code> kontrol\u00fc ve API'nin kendi hata mesajlar\u0131n\u0131 yakalama, daha sa\u011flam bir hata y\u00f6netimi sa\u011flar.<\/p>\n<p>Bu kodu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda (\u00f6nceki <code class=\"language-javascript\">getSinglePost()<\/code> \u00e7a\u011fr\u0131s\u0131n\u0131 yorum sat\u0131r\u0131 yapmay\u0131 unutmay\u0131n), \u0130stanbul ve Londra'n\u0131n hava durumu bilgilerini, ayr\u0131ca \"NonExistentCity\" i\u00e7in bir hata mesaj\u0131n\u0131 g\u00f6rmelisiniz. Bu vaka analizi, ger\u00e7ek d\u00fcnya API'leriyle \u00e7al\u0131\u015fman\u0131n temel dinamiklerini ve hata y\u00f6netiminin \u00f6nemini g\u00f6stermektedir.<\/p>\n<h2>Veri G\u00f6nderme \u0130\u015flemleri: POST, PUT ve DELETE Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>API'lerle etkile\u015fim sadece veri \u00e7ekmekle s\u0131n\u0131rl\u0131 de\u011fildir. \u00c7o\u011fu zaman, bir sunucuya yeni veri eklememiz, mevcut veriyi g\u00fcncellememiz veya silmemiz gerekir. Bu i\u015flemler genellikle HTTP'nin POST, PUT ve DELETE metotlar\u0131 kullan\u0131larak ger\u00e7ekle\u015ftirilir. Bu b\u00f6l\u00fcmde, <code class=\"language-javascript\">node-fetch<\/code> ile bu metotlar\u0131 nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 ve \u00f6zellikle JSON format\u0131nda veri g\u00f6ndermenin inceliklerini ele alaca\u011f\u0131z.<\/p>\n<h3>POST \u0130ste\u011fi ile Sunucuya Yeni Veri Ekleme<\/h3>\n<p>POST metodu, sunucuya yeni bir kaynak olu\u015fturmak i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, bir blog uygulamas\u0131na yeni bir g\u00f6nderi eklemek veya bir kullan\u0131c\u0131 kaydetmek gibi i\u015flemler POST iste\u011fiyle yap\u0131l\u0131r. POST istekleri, genellikle istek g\u00f6vdesinde (request body) g\u00f6nderilecek veriyi ta\u015f\u0131r.<\/p>\n<p>Yine JSONPlaceholder API'sini kullanarak yeni bir g\u00f6nderi olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-javascript\">\nasync function createPost() {\n  const newPost = {\n    title: 'Node.js ile Fetch API Denemesi',\n    body: 'Bu, Node.js kullanarak bir API\\'ye g\u00f6nderilen deneme bir yaz\u0131d\u0131r.',\n    userId: 1,\n  };\n\n  try {\n    const response = await fetch('https:\/\/jsonplaceholder.typicode.com\/posts', {\n      method: 'POST', \/\/ HTTP metodunu belirtiyoruz\n      headers: {\n        'Content-Type': 'application\/json', \/\/ G\u00f6nderdi\u011fimiz verinin t\u00fcr\u00fcn\u00fc belirtiyoruz\n      },\n      body: JSON.stringify(newPost), \/\/ JS objesini JSON string'ine d\u00f6n\u00fc\u015ft\u00fcr\u00fcyoruz\n    });\n\n    if (!response.ok) {\n      throw new Error(<code>HTTP Hata kodu: ${response.status}<\/code>);\n    }\n\n    const createdPost = await response.json();\n    console.log('\\nYeni g\u00f6nderi ba\u015far\u0131yla olu\u015fturuldu:', createdPost);\n    console.log('API genellikle olu\u015fturulan kayna\u011fa bir ID atar:', createdPost.id);\n  } catch (error) {\n    console.error('G\u00f6nderi olu\u015fturulurken bir hata olu\u015ftu:', error);\n  }\n}\n\ncreatePost();\n<\/pre>\n<p><\/code><\/p>\n<p>Burada dikkat etmeniz gereken noktalar:<\/p>\n<ul>\n<li><code class=\"language-javascript\">method: 'POST'<\/code>: \u0130stek tipini POST olarak belirtiriz.<\/li>\n<li><code class=\"language-javascript\">headers: { 'Content-Type': 'application\/json' }<\/code>: Sunucuya, istek g\u00f6vdesinin JSON format\u0131nda oldu\u011funu bildiririz. Bu ba\u015fl\u0131k, \u00e7o\u011fu REST API i\u00e7in kritik \u00f6neme sahiptir.<\/li>\n<li><code class=\"language-javascript\">body: JSON.stringify(newPost)<\/code>: JavaScript objemizi (<code>newPost<\/code>), API'nin anlayaca\u011f\u0131 JSON string format\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcr\u00fcz. Bu ad\u0131m hayati bir ad\u0131md\u0131r, \u00e7\u00fcnk\u00fc a\u011f \u00fczerinden direkt JavaScript objeleri g\u00f6nderilemez.<\/li>\n<\/ul>\n<p>JSONPlaceholder, ger\u00e7ekte bir veri taban\u0131na yazma i\u015flemi yapmaz; ancak ba\u015far\u0131l\u0131 bir POST iste\u011fine benzer \u015fekilde, g\u00f6nderilen veriye bir <code class=\"language-javascript\">id<\/code> atayarak bir yan\u0131t d\u00f6ner.<\/p>\n<h3>PUT ve DELETE \u0130stekleri ile Veri G\u00fcncelleme ve Silme<\/h3>\n<p>PUT metodu, mevcut bir kayna\u011f\u0131 tamamen g\u00fcncellemek i\u00e7in kullan\u0131l\u0131rken, PATCH metodu kayna\u011f\u0131n sadece belirli bir k\u0131sm\u0131n\u0131 g\u00fcncellemek i\u00e7in tercih edilir. DELETE metodu ise, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, belirli bir kayna\u011f\u0131 sunucudan silmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h4>PUT \u0130ste\u011fi (Veri G\u00fcncelleme)<\/h4>\n<p>Mevcut bir g\u00f6nderiyi g\u00fcncelleyelim. Genellikle, g\u00fcncellenecek kayna\u011f\u0131n ID'si URL i\u00e7inde belirtilir:<\/p>\n<pre><code class=\"language-javascript\">\nasync function updatePost(postId) {\n  const updatedData = {\n    title: 'G\u00fcncellenmi\u015f Ba\u015fl\u0131k: Node.js ve Fetch API',\n    body: 'Bu g\u00f6nderi, Node.js fetch ile g\u00fcncellendi.',\n    userId: 1, \/\/ userId'yi koruyabilir veya de\u011fi\u015ftirebiliriz\n  };\n\n  try {\n    const response = await fetch(<code>https:\/\/jsonplaceholder.typicode.com\/posts\/${postId}<\/code>, {\n      method: 'PUT',\n      headers: {\n        'Content-Type': 'application\/json',\n      },\n      body: JSON.stringify(updatedData),\n    });\n\n    if (!response.ok) {\n      throw new Error(<code>HTTP Hata kodu: ${response.status}<\/code>);\n    }\n\n    const result = await response.json();\n    console.log(<code>\\nG\u00f6nderi ${postId} ba\u015far\u0131yla g\u00fcncellendi:<\/code>, result);\n  } catch (error) {\n    console.error(<code>G\u00f6nderi ${postId} g\u00fcncellenirken bir hata olu\u015ftu:<\/code>, error);\n  }\n}\n\nupdatePost(1); \/\/ ID'si 1 olan g\u00f6nderiyi g\u00fcncelle\n<\/pre>\n<p><\/code><\/p>\n<p>PUT iste\u011fi de POST gibi <code class=\"language-javascript\">body<\/code> ve <code class=\"language-javascript\">Content-Type<\/code> ba\u015fl\u0131\u011f\u0131 gerektirir.<\/p>\n<h4>DELETE \u0130ste\u011fi (Veri Silme)<\/h4>\n<p>Bir kayna\u011f\u0131 silmek i\u00e7in DELETE metodu kullan\u0131l\u0131r. Bu istek genellikle bir g\u00f6vde ta\u015f\u0131maz:<\/p>\n<pre><code class=\"language-javascript\">\nasync function deletePost(postId) {\n  try {\n    const response = await fetch(<code>https:\/\/jsonplaceholder.typicode.com\/posts\/${postId}<\/code>, {\n      method: 'DELETE',\n    });\n\n    if (!response.ok) {\n      throw new Error(<code>HTTP Hata kodu: ${response.status}<\/code>);\n    }\n\n    \/\/ DELETE iste\u011fi genellikle bo\u015f bir yan\u0131t g\u00f6vdesi veya ba\u015far\u0131 durumu d\u00f6ner\n    console.log(<code>\\nG\u00f6nderi ${postId} ba\u015far\u0131yla silindi.<\/code>);\n    \/\/ E\u011fer API bir yan\u0131t g\u00f6vdesi d\u00f6nd\u00fcr\u00fcyorsa, onu da ayr\u0131\u015ft\u0131rabiliriz:\n    \/\/ const result = await response.json();\n    \/\/ console.log(result);\n  } catch (error) {\n    console.error(<code>G\u00f6nderi ${postId} silinirken bir hata olu\u015ftu:<\/code>, error);\n  }\n}\n\ndeletePost(1); \/\/ ID'si 1 olan g\u00f6nderiyi sil\n<\/pre>\n<p><\/code><\/p>\n<p>DELETE iste\u011finde, sunucudan ba\u015far\u0131l\u0131 bir yan\u0131t ald\u0131\u011f\u0131m\u0131zda (genellikle 200 OK veya 204 No Content), i\u015flemin ba\u015far\u0131l\u0131 oldu\u011funu varsayabiliriz. \u00c7o\u011fu durumda, DELETE istekleri bir yan\u0131t g\u00f6vdesi d\u00f6nd\u00fcrmez.<\/p>\n<p>Bu b\u00f6l\u00fcm, Node.js ile Fetch API kullanarak sadece veri \u00e7ekmekle kalmay\u0131p, ayn\u0131 zamanda sunucu taraf\u0131nda veri olu\u015fturma, g\u00fcncelleme ve silme gibi temel CRUD (Create, Read, Update, Delete) i\u015flemlerini nas\u0131l ger\u00e7ekle\u015ftirece\u011finizi g\u00f6stermektedir. Bu, dinamik ve etkile\u015fimli uygulamalar geli\u015ftirmenin anahtar\u0131d\u0131r.<\/p>\n<h2>Performans ve G\u00fcvenlik \u0130pu\u00e7lar\u0131: \u0130leri D\u00fczey Kullan\u0131m<\/h2>\n<p>Node.js ile API etkile\u015fimlerinde ba\u015far\u0131l\u0131 olmak sadece do\u011fru kod yazmakla bitmez; ayn\u0131 zamanda performans\u0131 optimize etmek ve g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 \u00f6nlemek de b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Bu b\u00f6l\u00fcmde, deneyimli geli\u015ftiriciler i\u00e7in kritik ipu\u00e7lar\u0131n\u0131 ve p\u00fcf noktalar\u0131n\u0131 ele alaca\u011f\u0131z.<\/p>\n<h3>API Yan\u0131tlar\u0131n\u0131 \u00d6nbelle\u011fe Alma (Caching)<\/h3>\n<p>S\u0131k\u00e7a talep edilen veriler i\u00e7in her defas\u0131nda API iste\u011fi yapmak hem sunucunuza ek y\u00fck bindirir hem de uygulaman\u0131z\u0131n yan\u0131t s\u00fcresini uzat\u0131r. Bu t\u00fcr durumlar i\u00e7in \u00f6nbelle\u011fe alma (caching) stratejileri uygulamak performans\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir. \u00d6rne\u011fin, bir hava durumu API'sinden \u00e7ekti\u011finiz veriler genellikle birka\u00e7 dakika boyunca ge\u00e7erlidir. Bu verileri yerel bir bellekte (\u00f6rne\u011fin, Node.js uygulaman\u0131z\u0131n kendi belle\u011finde veya Redis gibi bir in-memory veri taban\u0131nda) tutarak, belirli bir s\u00fcre boyunca ayn\u0131 istek geldi\u011finde API'ye tekrar gitmek yerine \u00f6nbellekten servis edebilirsiniz.<\/p>\n<pre><code class=\"language-javascript\">\nconst cache = {}; \/\/ Basit bir bellek i\u00e7i \u00f6nbellek\nconst CACHE_DURATION = 5 * 60 * 1000; \/\/ 5 dakika (milisaniye cinsinden)\n\nasync function getWeatherDataWithCache(city) {\n  const cacheKey = <code>weather_${city}<\/code>;\n  const now = Date.now();\n\n  if (cache[cacheKey] && (now - cache[cacheKey].timestamp < CACHE_DURATION)) {\n    console.log(<code>\\n\u00d6nbellekten \"${city}\" hava durumu verileri servis edildi.<\/code>);\n    displayWeather(cache[cacheKey].data);\n    return;\n  }\n\n  \/\/ \u00d6nbellekte yoksa veya s\u00fcresi dolduysa, API'den \u00e7ek\n  try {\n    const API_KEY = process.env.OPENWEATHER_API_KEY;\n    const BASE_URL = 'http:\/\/api.openweathermap.org\/data\/2.5\/weather';\n    const url = <code>${BASE_URL}?q=${city}&appid=${API_KEY}&units=metric&lang=tr<\/code>;\n\n    console.log(<code>API&#039;den \"${city}\" hava durumu verileri \u00e7ekiliyor...<\/code>);\n    const response = await fetch(url);\n\n    if (!response.ok) {\n      const errorData = await response.json();\n      throw new Error(<code>API hatas\u0131: ${response.status} - ${errorData.message || &#039;Bilinmeyen Hata&#039;}<\/code>);\n    }\n\n    const data = await response.json();\n    cache[cacheKey] = { data: data, timestamp: now }; \/\/ Veriyi \u00f6nbelle\u011fe al\n    displayWeather(data);\n  } catch (error) {\n    console.error('Hava durumu verisi \u00e7ekilirken bir hata olu\u015ftu (\u00f6nbelleksiz):', error.message);\n  }\n}\n\ngetWeatherDataWithCache('Paris');\nsetTimeout(() => getWeatherDataWithCache('Paris'), 1 * 60 * 1000); \/\/ 1 dakika sonra tekrar iste, \u00f6nbellekten gelir\nsetTimeout(() => getWeatherDataWithCache('Paris'), 6 * 60 * 1000); \/\/ 6 dakika sonra iste, API'den tekrar \u00e7eker\n<\/pre>\n<p><\/code><\/p>\n<p>Bu basit \u00f6nbellek mekanizmas\u0131, ayn\u0131 isteklerin tekrarlanmas\u0131n\u0131 \u00f6nleyerek API kota kullan\u0131m\u0131n\u0131z\u0131 da azaltabilir.<\/p>\n<h3>API Anahtarlar\u0131n\u0131n G\u00fcvenli Y\u00f6netimi<\/h3>\n<p>Daha \u00f6nce bahsetti\u011fimiz gibi, API anahtarlar\u0131n\u0131 do\u011frudan kodunuzda saklamak ciddi bir g\u00fcvenlik riskidir. Ortam de\u011fi\u015fkenleri (<code class=\"language-javascript\">.env<\/code> dosyas\u0131 ve <code class=\"language-javascript\">dotenv<\/code> k\u00fct\u00fcphanesi) bu sorunu \u00e7\u00f6zmek i\u00e7in harika bir y\u00f6ntemdir. Ancak, \u00fcretim ortam\u0131nda bu anahtarlar\u0131n daha da g\u00fcvenli bir \u015fekilde y\u00f6netilmesi gerekebilir. Kubernetes s\u0131rlar\u0131 (secrets), AWS Secrets Manager, HashiCorp Vault gibi ara\u00e7lar, hassas bilgileri g\u00fcvenli bir \u015fekilde depolamak ve uygulamalar\u0131n\u0131za da\u011f\u0131tmak i\u00e7in profesyonel \u00e7\u00f6z\u00fcmler sunar. Her zaman API anahtarlar\u0131n\u0131z\u0131 versiyon kontrol sistemlerine y\u00fcklemedi\u011finizden emin olun (\u00f6rn. <code class=\"language-text\">.gitignore<\/code> dosyas\u0131na <code class=\"language-text\">.env<\/code> ekleyin).<\/p>\n<h3>Hata Y\u00f6netimi ve Yeniden Deneme Mekanizmalar\u0131<\/h3>\n<p>A\u011f istekleri do\u011fas\u0131 gere\u011fi ba\u015far\u0131s\u0131z olabilir: API sunucusu ge\u00e7ici olarak kapal\u0131 olabilir, a\u011f ba\u011flant\u0131s\u0131 kesilebilir veya bir oran s\u0131n\u0131r\u0131 (rate limit) hatas\u0131 alabilirsiniz. Sa\u011flam bir uygulama, bu t\u00fcr durumlar\u0131 ele almal\u0131 ve gerekirse iste\u011fi belirli bir gecikmeyle yeniden denemelidir (retry mechanism).<\/p>\n<pre><code class=\"language-javascript\">\nasync function fetchWithRetry(url, options = {}, retries = 3, delay = 1000) {\n  for (let i = 0; i < retries; i++) {\n    try {\n      const response = await fetch(url, options);\n      if (response.ok) {\n        return response;\n      }\n      \/\/ \u00d6zellikle 429 Too Many Requests gibi hatalarda yeniden deneme yapabiliriz\n      if (response.status === 429 &#038;&#038; i < retries - 1) {\n        console.warn(<code>Oran s\u0131n\u0131r\u0131 hatas\u0131 (${response.status}). ${delay \/ 1000} saniye bekleyip tekrar deniyorum...<\/code>);\n        await new Promise(res => setTimeout(res, delay));\n        delay *= 2; \/\/ Gecikmeyi art\u0131rarak backoff stratejisi\n        continue;\n      }\n      throw new Error(<code>HTTP Hata kodu: ${response.status}<\/code>);\n    } catch (error) {\n      if (i < retries - 1) {\n        console.warn(<code>A\u011f hatas\u0131: ${error.message}. ${delay \/ 1000} saniye bekleyip tekrar deniyorum...<\/code>);\n        await new Promise(res => setTimeout(res, delay));\n        delay *= 2;\n        continue;\n      }\n      throw error; \/\/ Son denemede hala hata varsa, hatay\u0131 yukar\u0131ya f\u0131rlat\n    }\n  }\n}\n\n\/\/ Kullan\u0131m \u00f6rne\u011fi\n\/\/ fetchWithRetry('https:\/\/api.example.com\/data')\n\/\/   .then(response => response.json())\n\/\/   .then(data => console.log('Veri:', data))\n\/\/   .catch(error => console.error('T\u00fcm denemeler ba\u015far\u0131s\u0131z oldu:', error));\n<\/pre>\n<p><\/code><\/p>\n<p>Bu <code class=\"language-javascript\">fetchWithRetry<\/code> fonksiyonu, belirli bir say\u0131da deneme yapar ve her deneme aras\u0131nda artan bir gecikme (exponential backoff) uygular. Bu, API'ye a\u015f\u0131r\u0131 y\u00fck bindirmeden ge\u00e7ici sorunlar\u0131n \u00fcstesinden gelmeye yard\u0131mc\u0131 olur.<\/p>\n<h3>Zaman A\u015f\u0131m\u0131 (Timeout) Y\u00f6netimi<\/h3>\n<p>Bir API \u00e7a\u011fr\u0131s\u0131n\u0131n \u00e7ok uzun s\u00fcrmesi, uygulaman\u0131z\u0131n performans\u0131n\u0131 olumsuz etkileyebilir. \u00d6zellikle yan\u0131t vermeyen veya yava\u015f API'lerle \u00e7al\u0131\u015f\u0131rken zaman a\u015f\u0131m\u0131 ayarlamak \u00f6nemlidir. <code class=\"language-javascript\">node-fetch<\/code> do\u011frudan bir <code class=\"language-javascript\">timeout<\/code> se\u00e7ene\u011fi sunmaz, ancak bu functionality <code class=\"language-javascript\">AbortController<\/code> kullan\u0131larak veya \u00f6zel bir sarmalay\u0131c\u0131 (wrapper) fonksiyonu ile sa\u011flanabilir:<\/p>\n<pre><code class=\"language-javascript\">\nasync function fetchWithTimeout(url, options = {}, timeout = 5000) { \/\/ 5 saniye\n  const controller = new AbortController();\n  const id = setTimeout(() => controller.abort(), timeout);\n\n  try {\n    const response = await fetch(url, {\n      ...options,\n      signal: controller.signal\n    });\n    clearTimeout(id); \/\/ Zaman a\u015f\u0131m\u0131 tetiklenmeden \u00f6nce istek tamamland\u0131\n    return response;\n  } catch (error) {\n    clearTimeout(id);\n    if (error.name === 'AbortError') {\n      throw new Error('\u0130stek zaman a\u015f\u0131m\u0131na u\u011frad\u0131.');\n    }\n    throw error;\n  }\n}\n\n\/\/ Kullan\u0131m \u00f6rne\u011fi (varsay\u0131lan 5sn timeout ile)\n\/\/ fetchWithTimeout('https:\/\/slow-api.example.com\/data', {}, 2000) \/\/ 2 saniye timeout\n\/\/   .then(response => response.json())\n\/\/   .then(data => console.log('Veri:', data))\n\/\/   .catch(error => console.error('Hata:', error.message));\n<\/pre>\n<p><\/code><\/p>\n<p>Bu fonksiyon, belirtilen s\u00fcre i\u00e7inde yan\u0131t al\u0131namazsa iste\u011fi iptal eder, b\u00f6ylece uygulaman\u0131z\u0131n ask\u0131da kalmas\u0131n\u0131 engeller.<\/p>\n<div class=\"expert-tip\">\n  Mobil Uyumlu Tasar\u0131m Notu: Node.js sunucu taraf\u0131nda \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in direkt olarak HTML'in mobil uyumlulu\u011funu sa\u011flamak gibi bir g\u00f6revi yoktur. Ancak, Node.js ile render etti\u011finiz HTML veya sundu\u011funuz veriyi t\u00fcketen \u00f6n y\u00fcz uygulamalar\u0131 (taray\u0131c\u0131lar, mobil uygulamalar) i\u00e7in, responsive tasar\u0131m prensiplerini uygulamak kritik \u00f6neme sahiptir. CSS'de <code class=\"language-css\">@media<\/code> sorgular\u0131 kullanarak farkl\u0131 ekran boyutlar\u0131na uygun stiller tan\u0131mlamak, modern web geli\u015ftirmenin vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r. \u00d6rne\u011fin, sundu\u011funuz veriyi g\u00f6steren bir tablo i\u00e7in mobil cihazlarda kayd\u0131r\u0131labilir bir yap\u0131 veya daha k\u00fc\u00e7\u00fck ekranlarda kolonlar\u0131n alt alta s\u0131ralanmas\u0131 gibi \u00e7\u00f6z\u00fcmler d\u00fc\u015f\u00fcnebilirsiniz.\n<\/div>\n<pre><code class=\"language-css\">\n\/* Mobil cihazlar i\u00e7in \u00f6rnek medya sorgusu *\/\n@media (max-width: 768px) {\n  table {\n    display: block;\n    overflow-x: auto; \/* Tablo geni\u015f ekran\u0131 a\u015ft\u0131\u011f\u0131nda yatay kayd\u0131rma \u00e7ubu\u011fu *\/\n    white-space: nowrap;\n  }\n  \/* Ya da kolonlar\u0131 alt alta s\u0131ralamak i\u00e7in *\/\n  \/*\n  table tr {\n    display: block;\n    margin-bottom: 1em;\n  }\n  table td, table th {\n    display: block;\n    text-align: right;\n  }\n  table td::before {\n    content: attr(data-label);\n    float: left;\n    font-weight: bold;\n    text-transform: uppercase;\n  }\n  *\/\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki CSS kodu, Node.js ile sunulan bir HTML sayfas\u0131nda veya SPA (Single Page Application) ba\u011flam\u0131nda kullan\u0131ld\u0131\u011f\u0131nda, tablolar\u0131n k\u00fc\u00e7\u00fck ekranlarda daha iyi g\u00f6r\u00fcnmesini sa\u011flayabilir. Node.js'in rol\u00fc, bu t\u00fcr \u00f6n y\u00fczlerin ihtiya\u00e7 duydu\u011fu veriyi sa\u011flamakt\u0131r.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu makale boyunca, Node.js ortam\u0131nda Fetch API'yi kullanarak d\u0131\u015f servislerle nas\u0131l etkile\u015fim kuraca\u011f\u0131m\u0131z\u0131 detayl\u0131 bir \u015fekilde inceledik. Temel GET isteklerinden, dinamik parametrelerle ger\u00e7ek d\u00fcnya verisi \u00e7ekmeye, POST, PUT ve DELETE gibi veri manip\u00fclasyonu i\u015flemlerine kadar bir\u00e7ok konuya de\u011findik. Ayr\u0131ca, API entegrasyonlar\u0131n\u0131z\u0131n daha sa\u011flam, g\u00fcvenli ve performansl\u0131 olmas\u0131 i\u00e7in \u00f6nbellekleme, hata y\u00f6netimi, yeniden deneme mekanizmalar\u0131 ve zaman a\u015f\u0131m\u0131 gibi ileri d\u00fczey konulara da odakland\u0131k. Node.js'in asenkron yap\u0131s\u0131 ve <code class=\"language-javascript\">node-fetch<\/code> k\u00fct\u00fcphanesinin sa\u011flad\u0131\u011f\u0131 kolayl\u0131klar sayesinde, karma\u015f\u0131k API etkile\u015fimlerini bile basit ve okunabilir bir \u015fekilde y\u00f6netebiliriz. Unutmay\u0131n, pratik yapmak ve farkl\u0131 API'leri ke\u015ffetmek bu alandaki yetkinli\u011finizi art\u0131rman\u0131n en iyi yoludur. \u0130yi kodlamalar!<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<h4>Node.js'te Fetch API'yi neden kullanmal\u0131y\u0131m?<\/h4>\n<p>Fetch API, vaat (Promise) tabanl\u0131 modern ve g\u00fc\u00e7l\u00fc bir aray\u00fcz sunar. Bu, asenkron HTTP isteklerini <code class=\"language-javascript\">async\/await<\/code> s\u00f6z dizimiyle daha okunabilir ve y\u00f6netilebilir bir \u015fekilde yazman\u0131z\u0131 sa\u011flar. XMLHttpRequest'e k\u0131yasla daha basittir ve taray\u0131c\u0131daki kullan\u0131m\u0131na benzerli\u011fi sayesinde tutarl\u0131l\u0131k sunar.<\/p>\n<h4><code class=\"language-javascript\">node-fetch<\/code> yerine ba\u015fka hangi k\u00fct\u00fcphaneler var?<\/h4>\n<p><code class=\"language-javascript\">node-fetch<\/code>, taray\u0131c\u0131 Fetch API'sinin Node.js portu olmas\u0131 nedeniyle pop\u00fclerdir. Ancak Axios, Superagent gibi daha olgun ve zengin \u00f6zelliklere sahip HTTP istemci k\u00fct\u00fcphaneleri de mevcuttur. Axios, \u00f6zellikle otomatik JSON d\u00f6n\u00fc\u015ft\u00fcrme, iste\u011fi ve yan\u0131t\u0131 yakalama (interceptors) gibi g\u00fc\u00e7l\u00fc \u00f6zellikleriyle \u00f6ne \u00e7\u0131kar.<\/p>\n<h4>API anahtarlar\u0131m\u0131 nas\u0131l g\u00fcvende tutabilirim?<\/h4>\n<p>API anahtarlar\u0131n\u0131z\u0131 asla do\u011frudan kodunuzda veya versiyon kontrol sistemlerinde (Git) saklamay\u0131n. Ortam de\u011fi\u015fkenleri (<code class=\"language-javascript\">.env<\/code> dosyas\u0131 ve <code class=\"language-javascript\">dotenv<\/code> k\u00fct\u00fcphanesi ile), hassas verileri kod taban\u0131n\u0131zdan ay\u0131rmak i\u00e7in basit ve etkili bir y\u00f6ntemdir. \u00dcretim ortam\u0131nda ise Kubernetes Secrets, AWS Secrets Manager gibi daha geli\u015fmi\u015f gizli y\u00f6netim \u00e7\u00f6z\u00fcmleri kullanman\u0131z \u00f6nerilir.<\/p>\n<h4>Hata y\u00f6netimi i\u00e7in en iyi pratikler nelerdir?<\/h4>\n<p>Hata y\u00f6netiminde temel ad\u0131mlar \u015funlard\u0131r: HTTP durum kodlar\u0131n\u0131 kontrol etmek (<code class=\"language-javascript\">response.ok<\/code>), <code class=\"language-javascript\">try...catch<\/code> bloklar\u0131 kullanarak a\u011f ve uygulama seviyesi hatalar\u0131 yakalamak, kullan\u0131c\u0131ya anlaml\u0131 hata mesajlar\u0131 sunmak ve gerekirse ba\u015far\u0131s\u0131z istekleri belirli bir gecikmeyle (backoff stratejisi ile) yeniden denemek.<\/p>\n<h4>Asenkron i\u015flemler neden \u00f6nemlidir?<\/h4>\n<p>Asenkron i\u015flemler, bir uygulaman\u0131n uzun s\u00fcreli g\u00f6revleri (\u00f6rne\u011fin a\u011f istekleri, dosya okuma\/yazma) ana i\u015f par\u00e7ac\u0131\u011f\u0131n\u0131 (main thread) bloke etmeden ger\u00e7ekle\u015ftirmesini sa\u011flar. Node.js'in tek i\u015f par\u00e7ac\u0131kl\u0131 ve olay d\u00f6ng\u00fcs\u00fc (event loop) tabanl\u0131 yap\u0131s\u0131nda bu \u00f6zellikle kritiktir. Aksi takdirde, bir API \u00e7a\u011fr\u0131s\u0131n\u0131n yan\u0131t\u0131n\u0131 beklerken uygulaman\u0131z tamamen durur ve yan\u0131t veremez hale gelir, bu da k\u00f6t\u00fc bir kullan\u0131c\u0131 deneyimine yol a\u00e7ar.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Modern web uygulamalar\u0131 geli\u015ftirirken, sunucu taraf\u0131nda d\u0131\u015f kaynaklardan veri \u00e7ekmek veya bu kaynaklara veri g\u00f6ndermek ka\u00e7\u0131n\u0131lmaz bir ihtiya\u00e7t\u0131r.&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":[136],"tags":[],"class_list":{"0":"post-34846","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-node-js","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>Node.js API Fetch \u00d6rne\u011fi: Ger\u00e7ek Verilerle Nas\u0131l \u00c7al\u0131\u015f\u0131l\u0131r?<\/title>\n<meta name=\"description\" content=\"Modern web uygulamalar\u0131 geli\u015ftirirken, sunucu taraf\u0131nda d\u0131\u015f kaynaklardan veri \u00e7ekmek veya bu kaynaklara veri g\u00f6ndermek ka\u00e7\u0131n\u0131lmaz bir ihtiya\u00e7t\u0131r. Node.js, asenkron yap\u0131s\u0131 ve g\u00fc\u00e7l\u00fc ekosistemi sayesinde bu t\u00fcr API etkile\u015fimleri i\u00e7in ideal bir platform sunar. Bu makale, Node.js ortam\u0131nda Fetch API&#039;yi ger\u00e7ek d\u00fcnya verileriyle nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayarak, hem yeni ba\u015flayanlar\u0131n hem de deneyimli geli\u015ftiricilerin bu konudaki bilgi birikimini art\u0131rmay\u0131 hedeflemektedir.\" \/>\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\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Node.js API Fetch \u00d6rne\u011fi: Ger\u00e7ek Verilerle Nas\u0131l \u00c7al\u0131\u015f\u0131l\u0131r?\" \/>\n<meta property=\"og:description\" content=\"Modern web uygulamalar\u0131 geli\u015ftirirken, sunucu taraf\u0131nda d\u0131\u015f kaynaklardan veri \u00e7ekmek veya bu kaynaklara veri g\u00f6ndermek ka\u00e7\u0131n\u0131lmaz bir ihtiya\u00e7t\u0131r. Node.js, asenkron yap\u0131s\u0131 ve g\u00fc\u00e7l\u00fc ekosistemi sayesinde bu t\u00fcr API etkile\u015fimleri i\u00e7in ideal bir platform sunar. Bu makale, Node.js ortam\u0131nda Fetch API&#039;yi ger\u00e7ek d\u00fcnya verileriyle nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayarak, hem yeni ba\u015flayanlar\u0131n hem de deneyimli geli\u015ftiricilerin bu konudaki bilgi birikimini art\u0131rmay\u0131 hedeflemektedir.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-22T16:30:58+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=\"23 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Node.js API Fetch \u00d6rne\u011fi: Ger\u00e7ek Verilerle Nas\u0131l \u00c7al\u0131\u015f\u0131l\u0131r?\",\"datePublished\":\"2025-11-22T16:30:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/\"},\"wordCount\":3235,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Node.js\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/\",\"name\":\"Node.js API Fetch \u00d6rne\u011fi: Ger\u00e7ek Verilerle Nas\u0131l \u00c7al\u0131\u015f\u0131l\u0131r?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-22T16:30:58+00:00\",\"description\":\"Modern web uygulamalar\u0131 geli\u015ftirirken, sunucu taraf\u0131nda d\u0131\u015f kaynaklardan veri \u00e7ekmek veya bu kaynaklara veri g\u00f6ndermek ka\u00e7\u0131n\u0131lmaz bir ihtiya\u00e7t\u0131r. Node.js, asenkron yap\u0131s\u0131 ve g\u00fc\u00e7l\u00fc ekosistemi sayesinde bu t\u00fcr API etkile\u015fimleri i\u00e7in ideal bir platform sunar. Bu makale, Node.js ortam\u0131nda Fetch API'yi ger\u00e7ek d\u00fcnya verileriyle nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayarak, hem yeni ba\u015flayanlar\u0131n hem de deneyimli geli\u015ftiricilerin bu konudaki bilgi birikimini art\u0131rmay\u0131 hedeflemektedir.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node.js API Fetch \u00d6rne\u011fi: Ger\u00e7ek Verilerle Nas\u0131l \u00c7al\u0131\u015f\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":"Node.js API Fetch \u00d6rne\u011fi: Ger\u00e7ek Verilerle Nas\u0131l \u00c7al\u0131\u015f\u0131l\u0131r?","description":"Modern web uygulamalar\u0131 geli\u015ftirirken, sunucu taraf\u0131nda d\u0131\u015f kaynaklardan veri \u00e7ekmek veya bu kaynaklara veri g\u00f6ndermek ka\u00e7\u0131n\u0131lmaz bir ihtiya\u00e7t\u0131r. Node.js, asenkron yap\u0131s\u0131 ve g\u00fc\u00e7l\u00fc ekosistemi sayesinde bu t\u00fcr API etkile\u015fimleri i\u00e7in ideal bir platform sunar. Bu makale, Node.js ortam\u0131nda Fetch API'yi ger\u00e7ek d\u00fcnya verileriyle nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayarak, hem yeni ba\u015flayanlar\u0131n hem de deneyimli geli\u015ftiricilerin bu konudaki bilgi birikimini art\u0131rmay\u0131 hedeflemektedir.","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\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/","og_locale":"tr_TR","og_type":"article","og_title":"Node.js API Fetch \u00d6rne\u011fi: Ger\u00e7ek Verilerle Nas\u0131l \u00c7al\u0131\u015f\u0131l\u0131r?","og_description":"Modern web uygulamalar\u0131 geli\u015ftirirken, sunucu taraf\u0131nda d\u0131\u015f kaynaklardan veri \u00e7ekmek veya bu kaynaklara veri g\u00f6ndermek ka\u00e7\u0131n\u0131lmaz bir ihtiya\u00e7t\u0131r. Node.js, asenkron yap\u0131s\u0131 ve g\u00fc\u00e7l\u00fc ekosistemi sayesinde bu t\u00fcr API etkile\u015fimleri i\u00e7in ideal bir platform sunar. Bu makale, Node.js ortam\u0131nda Fetch API'yi ger\u00e7ek d\u00fcnya verileriyle nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayarak, hem yeni ba\u015flayanlar\u0131n hem de deneyimli geli\u015ftiricilerin bu konudaki bilgi birikimini art\u0131rmay\u0131 hedeflemektedir.","og_url":"https:\/\/fatihsoysal.com\/blog\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-22T16:30:58+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"23 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Node.js API Fetch \u00d6rne\u011fi: Ger\u00e7ek Verilerle Nas\u0131l \u00c7al\u0131\u015f\u0131l\u0131r?","datePublished":"2025-11-22T16:30:58+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/"},"wordCount":3235,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Node.js"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/","url":"https:\/\/fatihsoysal.com\/blog\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/","name":"Node.js API Fetch \u00d6rne\u011fi: Ger\u00e7ek Verilerle Nas\u0131l \u00c7al\u0131\u015f\u0131l\u0131r?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-22T16:30:58+00:00","description":"Modern web uygulamalar\u0131 geli\u015ftirirken, sunucu taraf\u0131nda d\u0131\u015f kaynaklardan veri \u00e7ekmek veya bu kaynaklara veri g\u00f6ndermek ka\u00e7\u0131n\u0131lmaz bir ihtiya\u00e7t\u0131r. Node.js, asenkron yap\u0131s\u0131 ve g\u00fc\u00e7l\u00fc ekosistemi sayesinde bu t\u00fcr API etkile\u015fimleri i\u00e7in ideal bir platform sunar. Bu makale, Node.js ortam\u0131nda Fetch API'yi ger\u00e7ek d\u00fcnya verileriyle nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayarak, hem yeni ba\u015flayanlar\u0131n hem de deneyimli geli\u015ftiricilerin bu konudaki bilgi birikimini art\u0131rmay\u0131 hedeflemektedir.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-api-fetch-ornegi-gercek-verilerle-nasil-calisilir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Node.js API Fetch \u00d6rne\u011fi: Ger\u00e7ek Verilerle Nas\u0131l \u00c7al\u0131\u015f\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\/34846","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=34846"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34846\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}