Intellipaat Back

Explore Courses Blog Tutorials Interview Questions
0 votes
3 views
in AWS by (19.1k points)

I'm working on an existing Windows Service project in VS 2013.

I've added a web API Controller class I can't remember now if its a (v2.1) or (v1) controller class....Anyway I've called it SyncPersonnelViaAwsApiController

I'm trying to call it from an AWS lambda...so If I call the GET

public string Get(int id)

    {

        return "value";

    }

with const req = https.request('https://actualUrlAddress/api/SyncPersonnelViaAwsApi/Get/4', (res) => {

I get returned body: undefined"value" which is correct. However, if I try and call

const req = https.request('https://actualUrlAddress/api/SyncPersonnelViaAwsApi/SapCall', (res) => {

I get returned body: undefined{"Message":"The requested resource does not support http method 'GET'."}

 //// POST api/<controller>

    public string SapCall([FromBody]string xmlFile)

    {

        string responseMsg = "Failed Import User";

 

        if (!IsNewestVersionOfXMLFile(xmlFile))

        {

            responseMsg = "Not latest version of file, update not performed";

        }

        else

        {

            Business.PersonnelReplicate personnelReplicate = BusinessLogic.SynchronisePersonnel.BuildFromDataContractXml<Business.PersonnelReplicate>(xmlFile);

            bool result = Service.Personnel.SynchroniseCache(personnelReplicate);

 

            if (result)

            {

                responseMsg = "Success Import Sap Cache User";

            }

        }

 

        return "{\"response\" : \" " + responseMsg + " \" , \"isNewActiveDirectoryUser\" : \" false \"}";

    }

Does anyone have any idea why it works for GET and not POST?

As we can hit the get I'm confident it's not the lambda but I have included it just incase

const AWS = require('aws-sdk');

const https = require('https');

var s3 = new AWS.S3();

var un;

var pw;

var seralizedXmlFile;

 

 

let index = function index(event, context, callback) {

 

    // For the purpose of testing I have populated the bucket and key params with objects that already exist in the S3 bucket  

    var params = {

    Bucket: "testbucketthur7thdec",

    Key: "personnelData_50312474_636403151354943757.xml"

};

 

 

// Get Object from S3 bucket and add to 'seralizedXmlFile'

s3.getObject(params, function (data, err) {

    console.log("get object from S3 bucket");

    if (err) {

        // an error occurred

    }

    else

    {

        console.log("data " + data);

        // populate seralizedXmlFile with data from S3 bucket

        let seralizedXmlFile = err.Body.toString('utf-8'); // Use the encoding necessary

        console.log("objectData " + seralizedXmlFile);

    }

 

});

 

    // set params

    var ssm = new AWS.SSM({ region: 'Usa2' });

    console.log('Instatiated SSM');

    var paramsx = {

        'Names': ['/Sap/ServiceUsername', '/Sap/ServicePassword'],

        'WithDecryption': true

    };

 

// password and username

    ssm.getParameters(paramsx, function (err, data) {

        console.log('Getting parameter');

        if (err) console.log(err, err.stack); // an error occurred

        else {

            console.log('data: ' + JSON.stringify(data));           // successful response

            console.log('password: ' + data.Parameters[0].Value);

            console.log('username: ' + data.Parameters[1].Value);

            pw = data.Parameters[0].Value;

            un = data.Parameters[1].Value;

        }

 

 

        // request to external api application & remove dependency on ssl

        process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

 

        //POST DOES NOT WORK

        const req = https.request('https://actualUrlAddress/api/SyncPersonnelViaAwsApi/SapEaiCall', (res) => {

        //GET WORKS

       // const req = https.request('https://actualUrlAddress/api/SyncPersonnelViaAwsApi/Get/4', (res) => {

 

            res.headers + 'Authorization: Basic ' + un + ':' + pw;

            let body = seralizedXmlFile;

            console.log('seralizedXmlFile: ' + seralizedXmlFile); 

            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');

                callback(null, body);

                console.log('returned body:', body);

 

            });

        });

        req.end();

    });

};

exports.handler = index;

I was able to include a post_options...please see updated lambda

          // An object of options to indicate where to post to

    var post_options = {

        host: 'https://actualUrlAddress',

        port: '80',

        path: '/api/SyncPersonnelViaAwsApi/SapEaiCall',

        method: 'POST',

        headers: {

            'Content-Type': 'application/json',

            'Content-Length': post_data.length

        }

    };

 

 const req = https.request(post_options, (res) => {

   res.headers + 'Authorization: Basic ' + un + ':' + pw;

            let body = seralizedXmlFile;

            console.log('seralizedXmlFile: ' + seralizedXmlFile); 

            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');

                callback(null, body);

                console.log('returned body:', body);

 

            });

        });

        req.end();

It is now flagging as error:

Error: getaddrinfo ENOTFOUND http://actualUrlAddress http://actualUrlAddress.private:80

I had this getaggrinfo ENOTFOUND error before, it means it can't find the address....but aren't the hostname and api path correct?

I am trying to reach

const req = https.request('https://actualUrlAddress/api/SyncPersonnelViaAwsApi/SapCall

and yes the port is 80

1 Answer

0 votes
by (44.4k points)

The options should look like the below settings. Also, SSL port mostly will be 443 and least likely be 80.

var post_options = {

    host: 'actualUrlAddress',

    protocol: 'https:'

    port: '443',

    path: '/api/SyncPersonnelViaAwsApi/SapEaiCall',

    method: 'POST',

    headers: {

        'Content-Type': 'application/json',

        'Content-Length': post_data.length

    }

};

Related questions

0 votes
1 answer
asked Nov 20, 2019 in Java by Nigam (4k points)
Want to get 50% Hike on your Salary?

Learn how we helped 50,000+ professionals like you !

0 votes
1 answer
0 votes
1 answer
asked Oct 9, 2019 in Java by Anvi (10.2k points)
0 votes
1 answer
asked Oct 9, 2019 in Python by Sammy (47.6k points)

31k questions

32.8k answers

501 comments

693 users

Browse Categories

...