在 Node.js 中与 cURL 等效?

我希望使用 Node.js 来使用来自 HTTP 请求的信息(即调用远程 Web 服务并将响应回送给客户端)。

在 PHP 中,我会使用 cURL 来完成这项工作。 Node 中的最佳实践是什么?

309964 次浏览

用于运行服务器的 http模块也用于发出远程请求。

以下是他们文档中的例子:

var http = require("http");


var options = {
host: 'www.google.com',
port: 80,
path: '/upload',
method: 'POST'
};


var req = http.request(options, function(res) {
console.log('STATUS: ' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers));
res.setEncoding('utf8');
res.on('data', function (chunk) {
console.log('BODY: ' + chunk);
});
});


req.on('error', function(e) {
console.log('problem with request: ' + e.message);
});


// write data to request body
req.write('data\n');
req.write('data\n');
req.end();

上面的示例可以工作,但还不足以真正处理真实世界的示例(即当您处理多个块中传入的数据时)。您需要确保的一件事是,您有一个“ on block”处理程序,它将数据推送到一个数组中(在 JS 中这样做的最快方法) ,还有一个“ on end”处理程序,它将所有数据连接在一起,以便您可以返回它。

当您处理大型请求(5000多行)并且服务器向您发送大量数据时,这一点尤其必要。

下面是我的一个程序中的一个例子(咖啡脚本) : Https://gist.github.com/1105888

如果你真的需要等效的旋度,你可以试试 node-curl

npm install node-curl

您可能需要添加 libcurl4-gnutls-dev

因为看起来 node-curl已经死了,所以我分叉了它,重命名了它,并且修改成了更像 curl 的形式,并且在 Windows 下编译。

node-libcurl

用法例子:

var Curl = require( 'node-libcurl' ).Curl;


var curl = new Curl();


curl.setOpt( Curl.option.URL, 'www.google.com' );
curl.setOpt( 'FOLLOWLOCATION', true );


curl.on( 'end', function( statusCode, body, headers ) {


console.info( statusCode );
console.info( '---' );
console.info( body.length );
console.info( '---' );
console.info( headers );
console.info( '---' );
console.info( this.getInfo( Curl.info.TOTAL_TIME ) );


this.close();
});


curl.on( 'error', function( err, curlErrorCode ) {


console.error( err.message );
console.error( '---' );
console.error( curlErrorCode );


this.close();


});


curl.perform();

执行是异步的,目前还没有办法使用它同步(可能永远也不会有)。

虽然还处于初始阶段,但很快就会有所改变,我们很感激你的帮助。

现在可以直接对同步请求使用 Easy句柄了,例如:

var Easy = require( 'node-libcurl' ).Easy,
Curl = require( 'node-libcurl' ).Curl,
url = process.argv[2] || 'http://www.google.com',
ret, ch;


ch = new Easy();


ch.setOpt( Curl.option.URL, url );


ch.setOpt( Curl.option.HEADERFUNCTION, function( buf, size, nmemb ) {


console.log( buf );


return size * nmemb;
});


ch.setOpt( Curl.option.WRITEFUNCTION, function( buf, size, nmemb ) {


console.log( arguments );


return size * nmemb;
});


// this call is sync!
ret = ch.perform();


ch.close();


console.log( ret, ret == Curl.code.CURLE_OK, Easy.strError( ret ) );

此外,该项目现在是稳定的!

我最终使用了 咕噜贝壳库。

这里 是我完全实现的 Grunt 任务的源代码要点,供其他考虑使用 EdgeCast API 的人使用。在我的示例中,您会发现我使用 grunt-shell 来执行 curl 命令来清除 CDN。

这就是我花了几个小时试图让一个 HTTP 请求在 Node 中工作之后得到的结果。我可以让一个人用 Ruby 和 Python 工作,但不符合这个项目的要求。

编辑:

对于新的项目,请避免使用请求,因为现在的项目是在维护模式,并最终将被弃用

Https://github.com/request/request/issues/3142

相反,我建议使用 Axios,这个库符合 Node 的最新标准,并且有一些可用的插件来增强它,支持模拟服务器响应、自动重试和其他特性。

Https://github.com/axios/axios

const axios = require('axios');


// Make a request for a user with a given ID
axios.get('/user?ID=12345')
.then(function (response) {
// handle success
console.log(response);
})
.catch(function (error) {
// handle error
console.log(error);
})
.then(function () {
// always executed
});

或使用异步/等待:

try{
const response = await axios.get('/user?ID=12345');
console.log(response)
} catch(axiosErr){
console.log(axiosErr)
}

我通常使用 REQUEST,它是 Node.js 的一个简化但强大的 HTTP 客户端

Https://github.com/request/request

这是 NPM 的节目 npm install request

下面是一个使用示例:

var request = require('request');


request('http://www.google.com', function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body) // Show the HTML for the Google homepage.
}
})

您可以很容易地使用请求模块:

Https://www.npmjs.com/package/request

示例代码:

var request = require('request');
request('http://www.google.com', function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body) // Show the HTML for the Google homepage.
}
else {
console.log("Error "+response.statusCode)
}
})

你可能想试试用这样的东西

curl = require('node-curl');
curl('www.google.com', function(err) {
console.info(this.status);
console.info('-----');
console.info(this.body);
console.info('-----');
console.info(this.info('SIZE_DOWNLOAD'));
});

您可以尝试使用 POSTMAN Chrome 应用程序为您的请求,您可以从那里生成节点 js 代码

使用 Reqclient,它是 request之上的一个小型客户机模块,允许您使用 使用 cURL 样式记录所有活动(可选,用于开发环境)。还有一些很好的特性,比如 URL 和参数解析、身份验证集成、缓存支持等等。

例如,如果你创建一个客户端对象,执行一个请求:

var RequestClient = require("reqclient").RequestClient;
var client = new RequestClient({
baseUrl:"http://baseurl.com/api/v1.1",
debugRequest:true, debugResponse:true
});


var resp = client.post("client/orders", {"client":1234,"ref_id":"A987"}, {headers: {"x-token":"AFF01XX"}})

它将在控制台中记录如下内容:

[Requesting client/orders]-> -X POST http://baseurl.com/api/v1.1/client/orders -d '{"client": 1234, "ref_id": "A987"}' -H '{"x-token": "AFF01XX"}' -H Content-Type:application/json
[Response   client/orders]<- Status 200 - {"orderId": 1320934}

请求将返回一个 我保证对象,因此您必须处理 thencatch如何处理结果。

reqclient可以与 Npm一起使用,您可以使用: npm install reqclient安装模块。

有 npm 模块,使一个像卷曲的请求,npm curlrequest

第一步: $npm i -S curlrequest

步骤2: 在节点文件中

let curl = require('curlrequest')
let options = {} // url, method, data, timeout,data, etc can be passed as options
curl.request(options,(err,response)=>{
// err is the error returned  from the api
// response contains the data returned from the api
})

为了进一步的阅读和理解,Npm curlrequest

我有一个问题发送 POST 数据从物联网 RaspberryPi 云数据库,但几个小时后,我设法得到它直。

我使用了命令提示符来做到这一点。

sudo curl --URL http://<username>.cloudant.com/<database_name> --user <api_key>:<pass_key> -X POST -H "Content-Type:application/json" --data '{"id":"123","type":"987"}'

命令提示符将显示问题-错误的用户名/传递; 错误的请求等。

—— URL 数据库/服务器位置(我使用了简单的免费 Cloudant DB) —— user 是身份验证部分 username: pass 我通过 API pass 输入 - X 定义要调用的命令(PUT、 GET、 POST、 DELETE) - H 内容类型-Cloudant 是关于文档数据库的,其中使用了 JSON ——数据内容本身按 JSON 排序

请求 npm 模块 请求节点模式是很好的使用,它有获取/后请求的选项设置加上它在生产环境中被广泛使用。

可以使用 request npm 模块。 用起来超简单。 请求被设计成进行 http 调用的最简单的方式。它支持 HTTPS,默认情况下遵循重定向。

var request = require('request');
request('http://www.google.com', function (error, response, body) {
console.log('error:', error); // Print the error if one occurred
console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
console.log('body:', body); // Print the HTML for the Google homepage.
});

使用请求 npm 模块和后调用

var request = require('request');
request('http://www.google.com', function (error, response, body) {
console.log('error:', error); // Print the error if one occurred
console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
console.log('body:', body); // Print the HTML for the Google homepage.
});

对于最佳实践,还可以使用一些 Winston日志记录器模块或其他简单的 console.log,然后像下面这样运行应用程序

npm start output.txt

上面命令的结果将在 root 上生成一个 txt 文件,其中包含您在 console.log 中打印的所有数据

下面是一个标准的 lib (http) 异步/等待解决方案。

const http = require("http");


const fetch = async (url) => {
return new Promise((resolve, reject) => {
http
.get(url, (resp) => {
let data = "";
resp.on("data", (chunk) => {
data += chunk;
});
resp.on("end", () => {
resolve(data);
});
})
.on("error", (err) => {
reject(err);
});
});
};

用法:

await fetch("http://example.com");

在 Node.js 18中,您可以直接使用 fetch

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