DEV Community

Vishal Raj
Vishal Raj

Posted on • Edited on

2 1

Making simple HTTP requests in NodeJS

Of course, there are numerous npm packages available to make HTTP requests. Just to name a few, you can use

many more. These all are super fantastic libraries which bring in array of capabilities on how to make HTTP request and handle various responses and errors.

But sometimes, all we need is, a simple HTTP/S request and response handler. This can be easily done with NodeJS's built-in packages http / https with a very simple lean piece of code. Lets see it in action.

NOTE: Since Promise is fancy, so I am gonna use it for this.

// SimpleHttp.js

const { URL } = require('url'),
    http = require('http'),
    https = require('https');

/**
 * Simple function to make HTTP / HTTPS request.
 *
 * @param {String} url The url to be scraped
 * @param {Object} config The configuration object to make HTTP request
 *
 * @return {Promise}
 */
module.exports = function fetch (url, config = {}) {
    const u = new URL(url),
        secure = 'https:' === u.protocol,
        handler = secure ? https : http,
        options = {
            method: config.method || 'GET',
            host: u.hostname,
            port: u.port || (secure ? 443 : 80),
            path: u.pathname,
            query: config.query || {},
        },
        isHeadRequest = 'HEAD' === options.method;

    return new Promise((resolve, reject) => {
        const request = handler.request(options, function (response) {
            const status = parseInt(response.statusCode, 10);

            if ([301, 302, 307].includes(status)) {
                resolve(load(response.headers.location, options));
            } else if (status < 200 || response >= 400) {
                reject(new Error(`Unexpected response, got HTTP ${status}`));
            } else {
                if (isHeadRequest) {
                    resolve({ headers: response.headersn} );
                } else {
                    const chunks = [];
                    response.on('data', function onData (chunk) {  
                        chunks.push(chunk);
                    });
                    response.on('end', function onEnd () { 
                        resolve({
                            status,
                            body: Buffer.concat(chunks).toString('utf8')
                        });
                    });
                }
            }
        });

        if (options.postBody) {
            request.write(postBody);
        }

        request.on('error', reject);

        request.end();
    });
}
Enter fullscreen mode Exit fullscreen mode

And that will be all.

EDIT: Added support to follow if server responds with HTTP redirect.

Heroku

Amplify your impact where it matters most — building exceptional apps.

Leave the infrastructure headaches to us, while you focus on pushing boundaries, realizing your vision, and making a lasting impression on your users.

Get Started

Top comments (0)

Image of PulumiUP 2025

Let's talk about the current state of cloud and IaC, platform engineering, and security.

Dive into the stories and experiences of innovators and experts, from Startup Founders to Industry Leaders at PulumiUP 2025.

Register Now

👋 Kindness is contagious

Please drop a ❤️ or a friendly comment on this post if it resonated with you!

Okay