我正在做一个需要 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 模块。
比如像这样:
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();
这是一个与公认答案略有不同的版本:
Promise
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)
告别node-fetch包,axios和request,...现在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);
}
我们可以像在浏览器中一样发出请求。
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....")
工作完成。