How to send a POST request with data in Node.js?

What is the proper way to make a node.js post request with data in Node.js?

I need to send an outbound HTTP POST request with some data in Node.js. How can I achieve this using the appropriate libraries or methods?

I’ve worked with HTTP requests in Node.js quite a bit, and one common scenario is testing APIs. Here’s an example of how to mock an HTTP POST request using pytest-mocker in Python, simulating a real API call in a testing environment. This approach is useful when you don’t want to send actual requests while running tests.

import pytest
import requests

def post_code(codestring):
    url = 'https://closure-compiler.appspot.com/compile'
    data = {
        'compilation_level': 'ADVANCED_OPTIMIZATIONS',
        'output_format': 'json',
        'output_info': 'compiled_code',
        'warning_level': 'QUIET',
        'js_code': codestring
    }
    
    response = requests.post(url, data=data)
    return response.json()

def test_post_code(mocker):
    mock_response = mocker.Mock()
    mock_response.json.return_value = {'compiledCode': 'someCompiledCode'}
    
    # Mock the requests.post method to avoid hitting the actual API
    mocker.patch('requests.post', return_value=mock_response)
    
    result = post_code('var x = 10;')
    assert result['compiledCode'] == 'someCompiledCode'

That’s a great approach for testing, But if you’re actually working with real-world APIs and don’t need mocking, you can directly use requests to send a node js post request. This is helpful when debugging or interacting with an external API in production.

import requests

def post_code(codestring):
    url = 'https://closure-compiler.appspot.com/compile'
    data = {
        'compilation_level': 'ADVANCED_OPTIMIZATIONS',
        'output_format': 'json',
        'output_info': 'compiled_code',
        'warning_level': 'QUIET',
        'js_code': codestring
    }
    
    response = requests.post(url, data=data)
    return response.json()

# Calling the function
result = post_code('var x = 10;')
print(result)

This approach ensures that you are actually hitting the API and getting real responses instead of mocked ones.

Both of your points make sense! Tom’s mocking method is great for testing, and Toby’s direct approach is good for production. But if you’re working with unittest.mock instead of pytest-mocker, here’s how you can mock a node js post request without using an external library.

import requests
from unittest import mock

def post_code(codestring):
    url = 'https://closure-compiler.appspot.com/compile'
    data = {
        'compilation_level': 'ADVANCED_OPTIMIZATIONS',
        'output_format': 'json',
        'output_info': 'compiled_code',
        'warning_level': 'QUIET',
        'js_code': codestring
    }
    
    response = requests.post(url, data=data)
    return response.json()

def test_post_code():
    mock_response = mock.Mock()
    mock_response.json.return_value = {'compiledCode': 'someCompiledCode'}
    
    with mock.patch('requests.post', return_value=mock_response):
        result = post_code('var x = 10;')
        assert result['compiledCode'] == 'someCompiledCode'

This works just like the pytest-mocker example but without needing additional dependencies, which can be useful if you’re sticking to standard libraries.