XMLHttpRequest vs Fetch API: Key Differences

This article provides a direct comparison between JavaScript’s traditional XMLHttpRequest object and the modern Fetch API. Both mechanisms enable asynchronous HTTP requests in web applications, allowing data retrieval without full page reloads. While XMLHttpRequest uses an older callback-driven model, the Fetch API introduces a modern, Promise-based interface that simplifies network handling, improves readability, and integrates seamlessly with modern JavaScript features like async/await.

1. Programming Model: Callbacks vs. Promises

2. Syntax Comparison

Making a GET Request with XMLHttpRequest:

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data', true);

xhr.onload = function () {
  if (xhr.status >= 200 && xhr.status < 300) {
    const data = JSON.parse(xhr.responseText);
    console.log(data);
  } else {
    console.error('Request failed with status:', xhr.status);
  }
};

xhr.onerror = function () {
  console.error('Network error occurred');
};

xhr.send();

Making a GET Request with Fetch API:

async function fetchData() {
  try {
    const response = await fetch('https://api.example.com/data');
    if (!response.ok) {
      throw new Error(`HTTP error! Status: ${response.status}`);
    }
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.error('Fetch error:', error.message);
  }
}

fetchData();

3. HTTP Error Handling

4. Progress Tracking and File Uploads

5. Request Cancellation

6. Cookies and Credentials

Summary Comparison

Feature XMLHttpRequest Fetch API
Architecture Event/Callback-based Promise-based (async/await)
Data Parsing Manual (JSON.parse) Built-in methods (.json(), .text(), .blob())
Request Abort xhr.abort() AbortController / AbortSignal
Upload Progress Native onprogress support Complex (Requires Streams)
Standardization Legacy standard Modern Web standard