'How to post JSON data to another server by lambda script

I am trying to send some JSON data(Fetched From DaynamoDB) to another server from AWS lambda function but while giving the URL in the script :

'use strict';

const https = require('https');

exports.handler = (event, context, callback) => {

      var options = {
      hostname: 'https://www.corecomputersystem.com',
      path: '/getSyncData.php',
      port : 432,
      method: 'POST',
      headers: {
          'Content-Type': 'application/json',
      }
    };
     event.Records.forEach((record) => {

        console.log(record.eventID);
        console.log(record.eventName);
        console.log('DynamoDB Record: %j', record.dynamodb);
        var res = record.dynamodb;

        const req = https.request(options, (res) => {
        let body = "";
        console.log('Status:', res.statusCode);
        console.log('Headers:', JSON.stringify(res.headers));
        res.setEncoding('utf8');
        res.on('data', (chunk) => body += chunk);
        res.on('end', () => {
            console.log('Successfully processed HTTPS response');
            // If we know it's JSON, parse it
            if (res.headers['content-type'] === 'application/json') {
                body = JSON.parse(body);
            }
            callback(null, body);
        });
    });
    req.on('error', callback);
    req.write(JSON.stringify(event.data) + "");
    req.end();
    //context.succeed();
    });

};

it's throwing following error,

{
  "errorMessage": "getaddrinfo ENOTFOUND https://www.corecomputersystem.com https://www.corecomputersystem.com:432",
  "errorType": "Error",
  "stackTrace": [
    "errnoException (dns.js:26:10)",
    "GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:77:26)"
  ]
}

and if I uncomment the context.succeed(), there is no error, I need help for identifying the error.



Solution 1:[1]

Just for deeply with @at0mzk says, a hostname never take any port number, so any prefix like [http, https, smb, nfs]:// will throw an error any where a hostname is requested.

(http://localhost === localhost:80)

Solution 2:[2]

remove https:// from hostname variable.

var options = {
  hostname: 'www.corecomputersystem.com',
  path: '/getSyncData.php',
  port : 432,
  method: 'POST',
  headers: {
      'Content-Type': 'application/json',
}

see docs.

Solution 3:[3]

Before making HTTPS request we can use :

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

so it will not ask for authorization.

Solution 4:[4]

Another way we can add a key in option before requesting HTTP:

rejectUnauthorized: false

It will not ask for self asigned certificate.

This is what I was searching for.

Solution 5:[5]

This worked for me.

In lambda use the following node js.

const https = require('https');
var querystring = require("querystring");
const doPostRequest = (event) => {
//parameters to post
const params = {
 name: "John",
 title: "Developer",
 userid: 123
};
var qs = querystring.stringify(params);
var qslength = qs.length;


return new Promise((resolve, reject) => {
    const options = {
      host: 'example.com',//without https or http
      path: '/yourpath/yourfile.php',
      method: 'POST',
      port: 443, // replace with 80 for HTTP requests
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': qslength
      }
    };
    var buffer = "";
    //create the request object with the callback with the result
    const req = https.request(options, (res) => {
      resolve(JSON.stringify(res.statusCode));
      res.on('data', function (chunk) {
       buffer+=chunk;
    });
    res.on('end', function() {
        console.log(buffer);
    });
    });

    // handle the possible errors
    req.on('error', (e) => {
      reject(e.message);
    });
    
    //do the request
    req.write(qs);

    //finish the request
    req.end();
  });
};
exports.handler = async (event) => {
  try {
    const result = await doPostRequest(event);
    console.log('result is:? ', result);

    //?? response structure assume you use proxy integration with API gateway
    return {
      statusCode: 200,
      headers: {'Content-Type': 'application/json'},
      body: JSON.stringify(result),
    };
  } catch (error) {
    console.log('Error is:? ', error);
    return {
      statusCode: 400,
      body: error.message,
    };
  }
};

For some reason lambda didnt show the response for me other than 200. So I had to create a logfile on my server to verify that it was sending the POST values. From there you can use json_encode to show the posted string or just echo the POST values

$inputJSON = json_encode($_POST);
$input = json_decode($inputJSON, TRUE);

$log  = "Data: ".$_SERVER['REMOTE_ADDR'].' - '.date("F j, Y, g:i a").PHP_EOL.
        "Data: ".$inputJSON.PHP_EOL.
        "Data: ".$input.PHP_EOL.
        "Data: ".$_POST['name'].PHP_EOL.
        "Data: ".$_POST['title'].PHP_EOL.
        "Data: ".$_POST['userid'].PHP_EOL.
        "-------------------------".PHP_EOL;
//Save string to log, use FILE_APPEND to append.
file_put_contents('./log_'.date("j.n.Y").'.log', $log, FILE_APPEND);

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Mech45
Solution 2 at0mzk
Solution 3 BDL
Solution 4 Tonechas
Solution 5 energy2080