如何在不使用`request`的情况下通过Node.js发布JSON?

时间:2017-09-05 09:34:08

标签: javascript json node.js

由于学术目的和其他相关政策,之前的answer需要request组件,我希望避免使用该组件。使用vanilla Node.js 8.4.0,我试过了:

var https = require('https');
var sendData = {
  api_key: 'abc',
  api_secret: '123',
  image_url: 'http://lalala.com/123/lalala.jpg',
  return_attributes: ['gender','age']
};
var options = {
  hostname: 'lalala.com',
  port: '443',
  path: '/info',
  method: 'POST',
  rejectUnauthorized: false,
  requestCert: true,
  headers: {
    'Content-Type': 'application/json',
  }
};
var openreq = https.request(options, function(serverFeedback){
  if (serverFeedback.statusCode == 200) {
    var body = '';
    serverFeedback.on('data', (data)=>{ body += data; })
      .on('end', ()=>{
        console.log(body);
      });
  } else {
    console.log('failed');
  }
});
openreq.write(JSON.stringify(sendData))
openreq.end();

可悲的是,上面的代码导致failed输出。

1 个答案:

答案 0 :(得分:1)

您的请求流没有任何问题,因为它几乎完全类似于Node.js文档HTTPHTTPS指南(除了JSON Content-Type)。但是,您只需查找200响应,而不期望错误可能会在serverFeedback.statusCode == 200条件之前捕获正文中的消息:

serverFeedback.setEncoding('utf8');
serverFeedback.on('data', (chunk) => {
  console.log(`BODY: ${chunk}`);
});
serverFeedback.on('end', () => {
  console.log('No more data in response.');
});

在任何情况下,问题肯定是远程主机,然后您还可以更密切地观察响应信息:

console.log(`STATUS: ${serverFeedback.statusCode}`);
console.log(`HEADERS: ${JSON.stringify(serverFeedback.headers)}`);

还有一件事,如果您使用版本 8 ,出于同样的学术目的,值得重新考虑使用var以支持{{1 }& let,以及胖箭头函数和Promises而不是回调。