如何在没有任何第三方模块的情况下在Node Js中发布https帖子?

时间:2016-11-10 22:00:08

标签: node.js post https

我正在开发一个需要https get和post方法的项目。我在这里有一个简短的https.get函数......

const https = require("https");

function get(url, callback) {
    "use-strict";
    https.get(url, function (result) {
        var dataQueue = "";    
        result.on("data", function (dataBuffer) {
            dataQueue += dataBuffer;
        });
        result.on("end", function () {
            callback(dataQueue);
        });
    });
}

get("https://example.com/method", function (data) {
    // do something with data
});

我的问题是没有https.post,我已经使用https模块How to make an HTTP POST request in node.js?尝试了http解决方案但是返回了控制台错误。

我在浏览器中使用Ajax和Ajax发布到同一个api时没有问题。我可以使用https.get来发送查询信息,但我不认为这是正确的方法,如果我决定扩展,我认为它不会在以后发送文件。

是否有一个小例子,具有最低要求,使https.request成为https.post(如果有的话)?我不想使用npm模块。

2 个答案:

答案 0 :(得分:90)

例如,像这样:

const querystring = require('querystring');                                                                                                                                                                                                
const https = require('https');

var postData = querystring.stringify({
    'msg' : 'Hello World!'
});

var options = {
  hostname: 'posttestserver.com',
  port: 443,
  path: '/post.php',
  method: 'POST',
  headers: {
       'Content-Type': 'application/x-www-form-urlencoded',
       'Content-Length': postData.length
     }
};

var req = https.request(options, (res) => {
  console.log('statusCode:', res.statusCode);
  console.log('headers:', res.headers);

  res.on('data', (d) => {
    process.stdout.write(d);
  });
});

req.on('error', (e) => {
  console.error(e);
});

req.write(postData);
req.end();

答案 1 :(得分:2)

这里的版本与接受的答案略有不同:

  • async
  • 可以直接传递网址(无需拆分为主机名、路径、端口)
  • 它处理错误的 HTTP 状态代码
  • 处理连接超时
  • 对于替代内容类型示例,它发送 JSON 而不是 x-www-form-urlencoded
const https = require('https')

async function post(url, data) {
  const dataString = JSON.stringify(data)

  const options = {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Content-Length': dataString.length,
    },
    timeout: 1000, // in ms
  }

  return new Promise((resolve, reject) => {
    const req = https.request(url, options, (res) => {
      if (res.statusCode < 200 || res.statusCode > 299) {
        return reject(new Error(`HTTP status code ${res.statusCode}`))
      }

      const body = []
      res.on('data', (chunk) => body.push(chunk))
      res.on('end', () => {
        const resString = Buffer.concat(body).toString()
        resolve(resString)
      })
    })

    req.on('error', (err) => {
      reject(err)
    })

    req.on('timeout', () => {
      req.destroy()
      reject(new Error('Request time out'))
    })

    req.write(dataString)
    req.end()
  })
}

const res = await post('https://...', data)