To perform an HTTP GET request in JavaScript, you can use several methods depending on your needs and environment. Below are the most common approaches with detailed explanations and examples:
1. Using XMLHttpRequest (Traditional Method)
The classic way to send HTTP requests, supported in all browsers.
Example:
// Create a new XMLHttpRequest object
const xhr = new XMLHttpRequest();
// Configure the request (method, URL, async)
xhr.open('GET', 'https://api.example.com/data', true);
// Set up a callback for when the request completes
xhr.onload = function() {
  if (xhr.status >= 200 && xhr.status < 300) {
    // Parse the response (e.g., JSON)
    const data = JSON.parse(xhr.responseText);
    console.log('Success:', data);
  } else {
    console.error('Request failed:', xhr.statusText);
  }
};
// Handle network errors
xhr.onerror = function() {
  console.error('Network error');
};
// Send the request
xhr.send();Key Notes:
- Asynchronous: The third parameter in xhr.openistrueby default (async).
- Response Handling: Use xhr.responseTextfor text/JSON responses.
- Legacy Support: Works in all browsers, including older ones.
2. Using the fetch API (Modern Method)
The newer, Promise-based API for cleaner and more flexible requests.
Example (Basic):
fetch('https://api.example.com/data')
  .then(response => {
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    return response.json(); // Parse JSON
  })
  .then(data => console.log('Success:', data))
  .catch(error => console.error('Error:', error));Example (Async/Await):
async function fetchData() {
  try {
    const response = await fetch('https://api.example.com/data');
    if (!response.ok) throw new Error(`HTTP error: ${response.status}`);
    const data = await response.json();
    console.log('Success:', data);
  } catch (error) {
    console.error('Error:', error);
  }
}
fetchData();Key Notes:
- Promise-Based: Uses .then()orasync/awaitfor asynchronous handling.
- Response Methods: Use .json(),.text(), or.blob()to parse the response.
- Error Handling: The fetchpromise doesn’t reject on HTTP errors (e.g., 404, 500), so checkresponse.ok.
3. Using Query Parameters
For GET requests with URL parameters, append them to the URL.
Example:
const params = new URLSearchParams({
  userId: 1,
  category: 'books'
});
const url = `https://api.example.com/data?${params}`;
// Using fetch
fetch(url)
  .then(response => response.json())
  .then(data => console.log(data));Resulting URL:
https://api.example.com/data?userId=1&category=books4. Adding Headers
Customize requests with headers (e.g., authentication tokens).
Example with fetch:
fetch('https://api.example.com/data', {
  headers: {
    'Authorization': 'Bearer YOUR_TOKEN',
    'Content-Type': 'application/json'
  }
})
  .then(response => response.json());5. Using Third-Party Libraries (e.g., Axios)
Libraries like Axios simplify HTTP requests with additional features.
Example with Axios:
// Install via npm/yarn: npm install axios
import axios from 'axios';
axios.get('https://api.example.com/data')
  .then(response => console.log(response.data))
  .catch(error => console.error(error));Advantages:
- Automatic JSON parsing.
- Better error handling (rejects on HTTP errors).
- Supports interceptors and request cancellation.
Key Differences
| Method | Pros | Cons | 
|---|---|---|
| XMLHttpRequest | Universal browser support. | Verbose syntax. | 
| fetch | Modern, Promise-based, clean syntax. | No automatic HTTP error handling. | 
| Axios | Simplified syntax, automatic error handling. | Requires installing a library. | 
Common Use Cases
- Fetching JSON Data:
   fetch('https://api.example.com/users')
     .then(response => response.json())
     .then(users => console.log(users));- Handling Errors:
   fetch('https://api.example.com/invalid-url')
     .then(response => {
       if (!response.ok) throw new Error('Not Found');
       return response.json();
     })
     .catch(error => console.error('Failed:', error));- Canceling Requests (Advanced):
 UseAbortControllerwithfetch:
   const controller = new AbortController();
   const signal = controller.signal;
   fetch('https://api.example.com/data', { signal })
     .then(response => response.json())
     .catch(error => {
       if (error.name === 'AbortError') {
         console.log('Request canceled');
       }
     });
   // Cancel the request after 5 seconds
   setTimeout(() => controller.abort(), 5000);Final Notes
- Security: Always use HTTPS for production requests.
- CORS: Ensure the server allows cross-origin requests if fetching from a different domain.
- Browser Support: Use polyfills (e.g., whatwg-fetch) for older browsers if usingfetch.
By choosing the right method for your project, you can efficiently handle HTTP GET requests in JavaScript.