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

Posted

技术标签:

【中文标题】如何在没有任何第三方模块的情况下在 Node Js 中发布 https 帖子?【英文标题】:How do I make a https post in Node Js without any third party module? 【发布时间】:2017-03-25 01:55:28 【问题描述】:

我正在开发一个需要 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 获取和发布到同一个 api 没有问题。我可以使用 https.get 发送查询信息,但我认为这不是正确的方式,如果我决定扩展,我认为以后发送文件也不会起作用。

是否有一个具有最低要求的小例子来制作 https.request 如果有 https.post 会是什么?我不想使用 npm 模块。

【问题讨论】:

How to make an HTTP POST request in node.js?的可能重复 @congusbongus:不完全是因为这个问题是关于 HTTPS 的,不同于 HTTP... 【参考方案1】:

例如,像这样:

const https = require('https');

var postData = JSON.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();

【讨论】:

很好的答案@aring。如果要发送 JSON,请更改以下内容:var postData = JSON.stringify(msg: 'Hello World!')'Content-Type': 'application/json' 谢谢 - 我发现在选项中使用 require('http') 并将端口设置为 443 并不是发送 HTTP 请求的正确方法。 我假设req.write(postData); 将是数据的发布,我是否正确?我有数据从我发布到的地方返回,并在终端中以 JSON 格式输出数据。我如何能够将该数据保存到我从中返回的变量中? 可能要检查 res.statusCode 是否为 200,如果不是,则采取错误措施。 鉴于现在查询字符串被认为是遗留代码,您可能希望将其替换为 URLSearchParams nodejs.org/api/url.html#url_class_urlsearchparams【参考方案2】:

这是一个与接受的答案略有不同的版本:

async 可以直接传递URL(无需拆分为主机名、路径、端口) 它处理错误的 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)

【讨论】:

感谢分享,马克斯。为什么用 JSON.stringify 而不是 querystring.stringify? @Guido 在这个例子中我们是POSTing application/json 如果您知道接收到的数据的大致大小,预分配主体(或它的缓冲区)会很好。

以上是关于如何在没有任何第三方模块的情况下在 Node Js 中发布 https 帖子?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有任何附加模块的情况下在迷你 Web 服务器中返回 json?

如何在没有任何 vue 库的情况下在 vue 回调中获取 http 响应标头(axios)

在没有库的情况下在 Java 中读取 PKCS#1 或 SPKI 公钥

如何在没有外部库的情况下在 React 中实现 Google Maps JS API?

如何在没有第三方服务的情况下在开发过程中为 webhook 公开本地服务器?

在没有 JS 库的情况下在 <canvas> 上为 spritesheet 设置动画 [重复]