JavaScript'te Fetch/XMLHttpRequest

JavaScript'te Fetch/XMLHttpRequest

Bu makale JavaScript'te Fetch/XMLHttpRequest'i açıklar.

YouTube Video

javascript-html-fetch-xhr.html
  1<!DOCTYPE html>
  2<html lang="en">
  3<head>
  4  <meta charset="UTF-8">
  5  <title>JavaScript &amp; HTML</title>
  6  <style>
  7    * {
  8        box-sizing: border-box;
  9    }
 10
 11    body {
 12        margin: 0;
 13        padding: 1em;
 14        padding-bottom: 10em;
 15        font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
 16        background-color: #f7f9fc;
 17        color: #333;
 18        line-height: 1.6;
 19    }
 20
 21    .container {
 22        max-width: 800px;
 23        margin: 0 auto;
 24        padding: 1em;
 25        background-color: #ffffff;
 26        border: 1px solid #ccc;
 27        border-radius: 10px;
 28        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
 29    }
 30
 31    .container-flex {
 32        display: flex;
 33        flex-wrap: wrap;
 34        gap: 2em;
 35        max-width: 1000px;
 36        margin: 0 auto;
 37        padding: 1em;
 38        background-color: #ffffff;
 39        border: 1px solid #ccc;
 40        border-radius: 10px;
 41        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
 42    }
 43
 44    .left-column, .right-column {
 45        flex: 1 1 200px;
 46        min-width: 200px;
 47    }
 48
 49    h1, h2 {
 50        font-size: 1.2rem;
 51        color: #007bff;
 52        margin-top: 0.5em;
 53        margin-bottom: 0.5em;
 54        border-left: 5px solid #007bff;
 55        padding-left: 0.6em;
 56        background-color: #e9f2ff;
 57    }
 58
 59    button {
 60        display: block;
 61        margin: 1em auto;
 62        padding: 0.75em 1.5em;
 63        font-size: 1rem;
 64        background-color: #007bff;
 65        color: white;
 66        border: none;
 67        border-radius: 6px;
 68        cursor: pointer;
 69        transition: background-color 0.3s ease;
 70    }
 71
 72    button:hover {
 73        background-color: #0056b3;
 74    }
 75
 76    #output {
 77        margin-top: 1em;
 78        background-color: #1e1e1e;
 79        color: #0f0;
 80        padding: 1em;
 81        border-radius: 8px;
 82        min-height: 200px;
 83        font-family: Consolas, monospace;
 84        font-size: 0.95rem;
 85        overflow-y: auto;
 86        white-space: pre-wrap;
 87    }
 88
 89    .highlight {
 90        outline: 3px solid #ffc107; /* yellow border */
 91        background-color: #fff8e1;  /* soft yellow background */
 92        transition: background-color 0.3s ease, outline 0.3s ease;
 93    }
 94
 95    .active {
 96        background-color: #28a745; /* green background */
 97        color: #fff;
 98        box-shadow: 0 0 10px rgba(40, 167, 69, 0.5);
 99        transition: background-color 0.3s ease, box-shadow 0.3s ease;
100    }
101  </style>
102</head>
103<body>
104    <div class="container">
105        <h1>JavaScript Console</h1>
106        <button id="executeBtn">Execute</button>
107        <div id="output"></div>
108    </div>
109
110    <script>
111        // Override console.log to display messages in the #output element
112        (function () {
113            // Override console.log
114            const originalLog = console.log;
115            console.log = function (...args) {
116                originalLog.apply(console, args);
117                const message = document.createElement('div');
118                message.textContent = args.map(String).join(' ');
119                output.appendChild(message);
120            };
121
122            // Override console.error
123            const originalError = console.error;
124            console.error = function (...args) {
125                originalError.apply(console, args);
126                const message = document.createElement('div');
127                message.textContent = args.map(String).join(' ');
128                message.style.color = 'red'; // Color error messages red
129                output.appendChild(message);
130            };
131        })();
132
133        document.getElementById('executeBtn').addEventListener('click', () => {
134            // Prevent multiple loads
135            if (document.getElementById('externalScript')) return;
136
137            const script = document.createElement('script');
138            script.src = 'javascript-html-fetch-xhr.js';
139            script.id = 'externalScript';
140            //script.onload = () => console.log('javascript-html-fetch-xhr.js loaded and executed.');
141            //script.onerror = () => console.log('Failed to load javascript-html-fetch-xhr.js.');
142            document.body.appendChild(script);
143        });
144    </script>
145</body>
146</html>

JavaScript'te Fetch/XMLHttpRequest

JavaScript'teki Fetch ve XMLHttpRequest (XHR), HTTP istekleri göndermek ve sunucudan veri almak için kullanılabilir.

Fetch API

Fetch API, XHR'ın halefi olarak tasarlanmış HTTP isteklerini işlemek için modern bir yöntemdir. Promises'e dayalı asenkron bir API'dir ve daha basit ve esnek istek yönetimine olanak tanır.

Kullanım

 1fetch('http://127.0.0.1:3000/example.json')
 2    .then((response) => {
 3        if (!response.ok) {
 4            throw new Error('HTTP error: ' + response.status);
 5        }
 6        return response.json();  // Parse the response as JSON
 7    })
 8    .then((data) => {
 9        console.log(data);  // Use the fetched data
10        console.log(JSON.stringify(data));
11    })
12    .catch((error) => {
13        console.error('An error occurred:', error);  // Error handling
14    });
  • Bu kod, belirtilen URL'ye Fetch API kullanarak bir GET isteği gönderir, yanıtı JSON olarak işler ve sonucu görüntüler veya bir hata çıktısı verir.

Özellikler

Fetch API aşağıdaki özelliklere sahiptir:.

  • Promise tabanlı Asenkron işlemler Promises ile yönetilebilir, bu da kodun daha temiz ve okunması daha kolay olmasını sağlar.
  • Kolay hata yönetimi Hatalar, catch bloğu kullanılarak kolayca yönetilebilir.
  • response.json() gibi metodlarla ayrıştırma Yanıt verisi JSON veya metin formatında kolayca işlenebilir.
  • CORS desteği Fetch, Çapraz Kaynak Paylaşımı (CORS) kuralları temelinde çalışır.
  • Esnek istek yapılandırması Sadece GET/POST değil, PUT ve DELETE gibi HTTP methodları da kolayca yapılandırılabilir.

Örnek: POST İsteği

 1fetch('http://127.0.0.1:3000/example.json', {
 2        method: 'POST',
 3        headers: {
 4            'Content-Type': 'application/json'
 5        },
 6        body: JSON.stringify({ name: 'Alice', age: 25 })  // Send the request body as JSON
 7    })
 8    .then(response => response.json())
 9    .then(data => console.log(JSON.stringify(data)))
10    .catch(error => console.error('Error:', error));
  • Bu kod, JSON verisi içeren bir POST isteği gönderir ve sunucudan alınan yanıtı JSON olarak alıp gösterir.

Dezavantajlar

Fetch API'nin aşağıdaki dezavantajları vardır:.

  • Tarayıcı uyumluluğu Eski tarayıcılar (özellikle IE11), Fetch API'yi desteklemez.
  • İnce ayarlı kontrol yapmak zordur XHR'ye kıyasla, ilerleme olaylarını yönetmek gibi düşük seviyeli kontroller için uygun değildir.

XMLHttpRequest(XHR)

XMLHttpRequest, uzun süredir HTTP isteklerini yönetmek için kullanılan bir API'dir ve yaygın olarak AJAX (Asenkron JavaScript ve XML) için temel olarak kullanılmıştır. Tüm sayfayı yeniden yüklemeden sunucudan veri alınmasını sağlayan asenkron iletişime imkan tanır.

Kullanım

 1const xhr = new XMLHttpRequest();
 2xhr.open('GET', 'http://127.0.0.1:3000/example.json', true);
 3xhr.onreadystatechange = function() {
 4    if (xhr.readyState === 4 && xhr.status === 200) {
 5        const data = JSON.parse(xhr.responseText);  // Parse the response as JSON
 6        console.log(data);  // Use the data
 7        console.log(JSON.stringify(data));
 8    }
 9};
10xhr.send();  // Send the request
  • Bu kod, XMLHttpRequest kullanarak bir GET isteği gönderir, alınan JSON yanıtını ayrıştırır ve görüntüler.

Özellikler

XMLHttpRequest aşağıdaki özelliklere sahiptir:.

  • Callback tabanlı onreadystatechange gibi callback fonksiyonları, isteğin tamamlanmasını veya ilerlemesini izlemek için kullanılır.
  • Durum kodlarını ve hazır olma durumunu izleme İstek durumu, xhr.readyState ve xhr.status kullanılarak kontrol edilebilir.
  • Geniş uyumluluk Eski tarayıcılarda bile çalışır.
  • İstek ilerlemesini izleme İlerleme, xhr.upload.onprogress gibi olaylar kullanılarak izlenebilir.

Örnek: POST İsteği

 1const xhr = new XMLHttpRequest();
 2xhr.open('POST', 'http://127.0.0.1:3000/example.json', true);
 3xhr.setRequestHeader('Content-Type', 'application/json');
 4xhr.onreadystatechange = function() {
 5    if (xhr.readyState === 4 && xhr.status === 200) {
 6        const data = JSON.parse(xhr.responseText);
 7        console.log(data);
 8        console.log(JSON.stringify(data));
 9    }
10};
11xhr.send(JSON.stringify({ name: 'Alice', age: 25 }));  // Send the data
  • Bu kod, XMLHttpRequest kullanarak JSON verisi ile bir POST isteği gönderir, yanıtı alır ve görüntüler.

Dezavantajlar

XMLHttpRequest'in aşağıdaki dezavantajları vardır:.

  • Kod karmaşıklığı Callback fonksiyonlarla asenkron işlemleri yönetmek karmaşık olma eğilimindedir.
  • Yerel Promise desteği yoktur Promises varsayılan olarak desteklenmediği için asenkron işlemler biraz daha ayrıntılı (uzun) hale gelir.

Fetch API ve XMLHttpRequest arasındaki karşılaştırma

Özellikler Fetch API XMLHttpRequest (XHR)
Asenkron işleme Promises ile basit Callback fonksiyonları gerektirir
Hata yönetimi .catch() ile yönetilebilir readyState durumunu kontrol et
İlerleme olayları Desteklenmez onprogress ile yönetilir
Çapraz kaynak desteği CORS’u otomatik olarak destekler CORS’u destekler
Tarayıcı desteği IE11 ve daha eski sürümlerde desteklenmez Eski tarayıcılarla uyumludur
Kontrol detayı Basit ve sezgisel İnce ayarlanabilir kontrol sağlar

Özet

  • Fetch API, Promises tabanlı basit ve esnek HTTP istekleri sağlar ve modern tarayıcılarda önerilir.

Yukarıdaki makaleyi, YouTube kanalımızda Visual Studio Code'u kullanarak takip edebilirsiniz. Lütfen YouTube kanalını da kontrol edin.

YouTube Video