Node.js发送外部API POST请求

Bro*_*Ban 2 https post node.js express angularjs

我试图将POST请求从我的angularjs控制器发送到nodejs服务器,然后应将完整的POST请求发送到外部API,这样就避免了CORS请求并使其更加安全,因为我正在发送相对私有的数据此POST请求。

我的用来向nodejs服务器发出发布请求的angularjs控制器函数看起来像这样,并且工作正常:

var noteData = {
    "id":accountNumber,
    "notes":[
        {
            "lId":707414,
            "oId":1369944,
            "nId":4154191,
            "price":23.84
        }
    ]
}

var req = {
    method: 'POST',
    url: '/note',
    data: noteData
}

$http(req).then(function(data){
    console.log(data);
});
Run Code Online (Sandbox Code Playgroud)

现在问题出在我的nodejs服务器上,我似乎无法弄清楚如何正确发送带有自定义标头的POST请求并传递JSON数据变量。

我已经使用了nodejs https函数,因为我需要访问的URL是一个https而不是http,所以我也尝试了request函数,但是没有运气。

我知道我发送的url和数据是正确的,因为当我将它们插入Postman时,它会返回我希望它返回的内容。这是我对nodejs服务器的不同尝试:

使用body-parser可以正确解析和检索来自angularjs请求的数据

尝试使用请求:

app.post('/buyNote', function (req, res) {
var options = {
    url: 'https://api.lendingclub.com/api/investor/v1/accounts/' + accountNumber + '/trades/buy/',
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Authorization': apiKey
    },
    data = JSON.stringify(req.body);
};


 request(options, function (error, response, body) {
     if (!error) {
         // Print out the response body
         // console.log(body)
         console.log(response.statusCode);
         res.sendStatus(200);
     } else {
         console.log(error);
     }
 })
Run Code Online (Sandbox Code Playgroud)

由于某种原因,这将返回状态码500,它错误地发送了数据,并因此解释了服务器错误的原因...

使用https

var options = {
    url: 'https://api.lendingclub.com/api/investor/v1/accounts/' +    accountNumber + '/trades/buy/',
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Authorization': apiKey
    }
   };
   var data = JSON.stringify(req.body);


var req = https.request(options, (res) => {
 console.log(`STATUS: ${res.statusCode}`);
 console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
 res.setEncoding('utf8');
 res.on('data', (chunk) => {
console.log(`BODY: ${chunk}`);
 });
 res.on('end', () => {
console.log('No more data in response.');
 });
  });

req.on('error', (e) => {
console.log(`problem with request: ${e.message}`);
 });


req.write(data);
req.end();
Run Code Online (Sandbox Code Playgroud)

Https由于某些原因尝试返回301状态...

使用相同的数据,Postman中的标头和url返回一个成功的响应200,其中包含我需要的数据...

我不明白如何提出简单的http请求...

请注意:这是我的第一个使用nodejs和angular的项目,我会知道如何轻松地在php或java中实现类似的功能,但这使我感到困惑。

Bro*_*Ban 5

因此,经过大量的摸索并尝试了不同的方法之后,我终于找到了性能良好且完全满足我需要的解决方案,而又不会使事情变得过于复杂:

诀窍就是使用名为request-promise的模块。这是我使用的代码:

const request = require('request-promise');

const options = {
    method: 'POST',
    uri: 'https://requestedAPIsource.com/api',
    body: req.body,
    json: true,
    headers: {
        'Content-Type': 'application/json',
        'Authorization': 'bwejjr33333333333'
    }
}

request(options).then(function (response){
    res.status(200).json(response);
})
.catch(function (err) {
    console.log(err);
})
Run Code Online (Sandbox Code Playgroud)

  • @ShanChathusandaJayathilaka 1 - 这完全取决于你如何设置你的应用程序,主体变量可以从nodejs接收,如果你需要,它最终只是一个对象。2 - 是的,主体是一个 JSON 对象 (2认同)