Making HTTP Requests in Node.js with Got

Making HTTP Requests in Node.js with Got

  • Node.js
  • 6 mins read

When building applications in Node.js, making HTTP requests is a fundamental task, whether you’re interacting with external APIs, fetching data, or communicating between services. While Node.js has a built-in http module for making requests, it’s not the most user-friendly or feature-rich solution. That’s where libraries like Got come in.

Got is a lightweight, feature-rich, and promise-based HTTP client for Node.js. It simplifies the process of making HTTP requests, providing a clean API, automatic retries, support for streams, and more. In this article, we’ll explore how to use Got for making HTTP requests and handling errors.

Why Choose Got for HTTP Requests?

Before diving into the code, it’s important to understand why Got is a preferred choice for many developers:

  • Simple API: Got provides a clean and intuitive API that makes it easy to perform various types of HTTP requests.
  • Promise-Based: Got is fully promise-based, allowing you to use async/await syntax for cleaner and more readable code.
  • Automatic Retries: Got can automatically retry requests on network failures or other issues, which is especially useful for improving the reliability of your application.
  • Support for Streams: Got supports streaming, which is useful for downloading large files or working with data in chunks.
  • Customizable: Got is highly customizable, with options to modify headers, query parameters, timeouts, and more.

Installing Got

To get started with Got, you’ll first need to install it in your Node.js project. If you haven’t already set up a Node.js project, follow these steps:

  1. Initialize Your Project: Open your terminal and create a new directory for your project:
   mkdir got-http-requests
   cd got-http-requests
   npm init -y

This command creates a new project directory and initializes it with a package.json file.

  1. Install Got: Next, install Got using npm:
   npm install got

Got is now added to your project, and you can start using it to make HTTP requests.

Making HTTP Requests with Got

Got makes it easy to perform various types of HTTP requests. Let’s walk through some common use cases.

1. Making a Basic GET Request

A GET request is the most common type of HTTP request, typically used to retrieve data from a server. With Got, making a GET request is straightforward:

const got = require('got');

(async () => {
    try {
        const response = await got('https://jsonplaceholder.typicode.com/posts/1');
        console.log('GET Request:');
        console.log(response.body);
    } catch (error) {
        console.error('Error in GET request:', error.message);
    }
})();
  • Explanation:
  • Endpoint: https://jsonplaceholder.typicode.com/posts/1 is a test API that returns the details of a post with ID 1.
  • Got Syntax: The got(url) function sends a GET request to the specified URL. The response is handled as a promise, allowing us to use await to wait for the response.
  • Response: The response body is logged to the console, which will contain the JSON data of the post.

2. Making a POST Request

A POST request is used to send data to a server, often to create a new resource. With Got, you can easily send JSON data in a POST request:

const got = require('got');

(async () => {
    try {
        const response = await got.post('https://jsonplaceholder.typicode.com/posts', {
            json: {
                title: 'foo',
                body: 'bar',
                userId: 1
            },
            responseType: 'json'
        });
        console.log('POST Request:');
        console.log(response.body);
    } catch (error) {
        console.error('Error in POST request:', error.message);
    }
})();
  • Explanation:
  • Endpoint: https://jsonplaceholder.typicode.com/posts is used to create a new post on the server.
  • JSON Data: The json option in the Got request allows you to specify the data to be sent. Here, we’re sending a new post with a title, body, and user ID.
  • Response: The server’s response, which includes the data that was sent along with a new ID, is logged to the console.

3. Handling Errors

Network issues or server errors can occur during HTTP requests. Got provides a simple way to handle these errors:

const got = require('got');

(async () => {
    try {
        const response = await got('https://nonexistent-url.com');
        console.log(response.body);
    } catch (error) {
        console.error('Error handling example:', error.message);
    }
})();
  • Explanation:
  • Non-Existent URL: This example tries to make a GET request to a URL that doesn’t exist.
  • Error Handling: Got automatically throws an error when the request fails. The catch block captures this error and logs the error message to the console.

Advanced Features of Got

Got isn’t just about making simple GET and POST requests. It comes with several advanced features that can help you handle more complex scenarios.

1. Customizing Request Options

Got allows you to customize requests by setting headers, query parameters, timeouts, and more:

const got = require('got');

(async () => {
    try {
        const response = await got('https://jsonplaceholder.typicode.com/posts/1', {
            headers: {
                'User-Agent': 'My-Custom-Agent'
            },
            searchParams: {
                userId: 1
            },
            timeout: 5000
        });
        console.log('Customized Request:');
        console.log(response.body);
    } catch (error) {
        console.error('Error in customized request:', error.message);
    }
})();
  • Explanation:
  • Headers: You can set custom headers using the headers option. Here, we set a custom User-Agent.
  • Query Parameters: The searchParams option allows you to add query parameters to the URL.
  • Timeout: The timeout option sets the maximum time (in milliseconds) the request can take before throwing an error.

2. Streaming with Got

Got supports streaming, which is useful for handling large data or working with files:

const fs = require('fs');
const got = require('got');

(async () => {
    const downloadStream = got.stream('https://via.placeholder.com/150');
    const fileWriterStream = fs.createWriteStream('downloaded_image.png');

    downloadStream.pipe(fileWriterStream);

    fileWriterStream.on('finish', () => {
        console.log('Image downloaded successfully.');
    });
})();
  • Explanation:
  • Streaming: The got.stream(url) function initiates a streaming GET request. The data is piped directly to a writable stream, such as a file.
  • File Writing: The fs.createWriteStream() function is used to write the streamed data to a file.

Download the source code here.

Conclusion

Got is a versatile and powerful library for making HTTP requests in Node.js. It simplifies the process of interacting with web services by providing a clean and intuitive API, while also offering advanced features like error handling, timeouts, and streams. Whether you’re building a simple script or a complex application, Got is an excellent choice for handling HTTP requests.

By using Got, you can write cleaner, more maintainable code and take advantage of its robust feature set to meet the needs of your application. So the next time you need to make an HTTP request in Node.js, consider using Got for a hassle-free experience.

Thanks for reading…

Happy Coding!