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

问题描述 投票:0回答:4

我正在做一个需要 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 模块尝试了 http 解决方案如何在 node.js 中发出 HTTP POST 请求? 但返回控制台错误。

我在浏览器中使用 Ajax get 和 post 到相同的 api 没有问题。我可以使用 https.get 发送查询信息,但我认为这不是正确的方式,而且如果我决定扩展,我认为稍后发送文件也行不通。

是否有一个小例子,以最低要求,发出一个 https.request 如果有的话,那将是一个 https.post?我不想使用 npm 模块。

node.js post https
4个回答
234
投票

比如像这样:

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

37
投票

这是一个与公认答案略有不同的版本:

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

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)

10
投票

在 Node.js 18 中

告别node-fetch包axiosrequest...现在fetch API默认在全局范围内可用。

发布请求

app.get('/', (req, res, next) => {
    // Make a post Request.
    
    fetch('https://jsonplaceholder.typicode.com/posts', {
        method: 'POST',
        body: JSON.stringify({
            title: 'foo',
            body: 'bar',
            userId: 1,
        }),
        headers: {
            'Content-type': 'application/json; charset=UTF-8',
        },
    })
        .then((response) => response.json())
        .then((json) => console.log(json))
        .catch(error => {
            console.log(error)
        })

    res.send('Fetch API is available on the global scope by default')
})

获取请求

const res = await fetch('https://nodejs.org/api/documentation.json');
if (res.ok) {
  const data = await res.json();
  console.log(data);
}

我们可以像在浏览器中一样发出请求。

更多信息


6
投票

谢天谢地,node-fetch 来了,

其他一切都是古老的历史。

const fetch = require('node-fetch');
// note: use npm install [email protected] to be able to use "require"

console.log("trying ...")

let body = {
    "ids": ["4e4e4e4e-4e4e-4e4e-4e4e-4e4e4e4e4e4e"]
};

fetch('https://blahblah.com/blah', {
    method: 'POST',
    body: JSON.stringify(body),
    headers: {
        'accept': 'application/json',
        'x-api-key': 'superamazingsecretcryptostuff',
        'Content-Type': 'application/json'
        // fyi, NO need for content length
    }
})
    .then(res => res.json())
    .then(json => console.log(json))
    .catch (err => console.log(err))

console.log("done....")

工作完成。

© www.soinside.com 2019 - 2024. All rights reserved.