我如何能使出站HTTP POST请求,与数据,在node.js?


当前回答

使用Node.js HTTP库进行任意HTTP请求。

不要使用不提供任何新功能的第三方包。

使用Node.js内置。

https://nodejs.org/api/http.html#httprequesturl-options-callback

示例来自文档中的http。request向你展示了如何创建一个“hello world”POST请求。

下面是一个例子。在评论中提出问题,例如,如果你正在学习Node.js,想要更多的资源。

const http = require('node:http');

const postData = JSON.stringify({
    'msg': 'Hello World!',
});

const options = { 
    hostname: 'www.google.com',
    port: 80, 
    path: '/upload',
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Content-Length': Buffer.byteLength(postData),
    },  
};

const req = http.request(options, (res) => {
    console.log(`STATUS: ${res.statusCode}`);
    console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
    res.setEncoding('utf8');
    res.on('data', (chunk) => {
        console.log(`BODY: ${chunk}`);
    }); 
    res.on('end', () => {
        console.log('No more data in response.');
    }); 
});

req.on('error', (e) => {
    console.error(`problem with request: ${e.message}`);
});

// Write data to request body
req.write(postData);
req.end();
~                                                                                                   
~                                                                                                   
~                                 

其他回答

我使用Restler和Needle用于生产目的。 它们都比本地httprequest强大得多。可以使用基本的身份验证、特殊的头条目甚至上传/下载文件进行请求。

至于post/get操作,它们也比使用httprequest的原始ajax调用简单得多。

needle.post('https://my.app.com/endpoint', {foo:'bar'}, 
    function(err, resp, body){
        console.log(body);
});

在为我的项目创建了一个低级实用程序来处理帖子和获取请求之后,我决定在这里发布我的努力。这里有一个关于发送JSON数据的http和https POST请求的代码片段。

const http = require("http")
const https = require("https")

// Request handler function
let postJSON = (options, postData, callback) => {

    // Serializing JSON
    post_data = JSON.stringify(postData)

    let port = options.port == 443 ? https : http

    // Callback function for the request
    let req = port.request(options, (res) => {
        let output = ''
        res.setEncoding('utf8')

        // Listener to receive data
        res.on('data', (chunk) => {
            output += chunk
        });

        // Listener for intializing callback after receiving complete response
        res.on('end', () => {
            let obj = JSON.parse(output)
            callback(res.statusCode, obj)
        });
    });

   // Handle any errors occurred while making request
    req.on('error', (err) => {
        //res.send('error: ' + err.message)
    });

    // Request is made here, with data as string or buffer
    req.write(post_data)
    // Ending the request
    req.end()
};

let callPost = () => {

    let data = {
        'name': 'Jon',
        'message': 'hello, world'
    }

    let options = {
        host: 'domain.name',       // Your domain name
        port: 443,                 // 443 for https and 80 for http
        path: '/path/to/resource', // Path for the request
        method: 'POST',            
        headers: {
            'Content-Type': 'application/json',
            'Content-Length': Buffer.byteLength(data)
        }
    }

    postJSON(options, data, (statusCode, result) => {
        // Handle response
        // Process the received data
    });

}

你也可以使用Requestify,这是我为nodeJS +编写的一个非常酷而简单的HTTP客户端,它支持缓存。

只需要做以下几点:

    var requestify = require('requestify');

    requestify.post('http://example.com', {
        hello: 'world'
    })
    .then(function(response) {
        // Get the response body (JSON parsed or jQuery object for XMLs)
        response.getBody();
    });

2020年更新:

我真的很喜欢phin -超轻量级的Node.js HTTP客户端

它有两种不同的用法。一个是promise (Async/Await),另一个是传统的回调样式。

安装通过:npm i phin

直接从它的README等待:

const p = require('phin')

await p({
    url: 'https://ethanent.me',
    method: 'POST',
    data: {
        hey: 'hi'
    }
})

未承诺(回调)风格:

const p = require('phin').unpromisified

p('https://ethanent.me', (err, res) => {
    if (!err) console.log(res.body)
})

截至2015年,现在有很多不同的库可以用最少的代码实现这一点。我更喜欢优雅的轻量级HTTP请求库,除非你绝对需要控制低级HTTP的东西。

Unirest就是这样一个库

要安装它,使用npm。 $ NPM安装unirest

然后是Hello, World!大家都熟悉的例子。

var unirest = require('unirest');

unirest.post('http://example.com/helloworld')
.header('Accept', 'application/json')
.send({ "Hello": "World!" })
.end(function (response) {
  console.log(response.body);
});

额外的: 很多人还建议使用请求[2]

值得注意的是,Unirest在幕后使用的是请求库。

Unirest提供了直接访问请求对象的方法。

例子:

var Request = unirest.get('http://mockbin.com/request');

发布另一个axios的例子。Post请求,使用额外的配置选项和自定义头。

var postData = { 电子邮件:“test@test.com”, 密码:“密码” }; let axiosConfig = { 标题:{ “内容类型”:“application / json; charset = utf - 8”, “Access-Control-Allow-Origin”:“*”, } }; axios。post('http://<主机>:<端口>/<路径>',postData, axiosConfig) .then((res) => { console.log("RESPONSE RECEIVED: ", res); }) .catch((err) => { console.log("AXIOS ERROR: ", err); })