Node.js 中的 cURL 等效项?
Posted
技术标签:
【中文标题】Node.js 中的 cURL 等效项?【英文标题】:cURL equivalent in Node.js? 【发布时间】:2011-10-12 17:53:57 【问题描述】:我希望通过 Node.js 使用来自 HTTP 请求的信息(即调用远程 Web 服务并将响应回显给客户端)。
在 php 中,我会使用 cURL 来执行此操作。 Node 的最佳实践是什么?
【问题讨论】:
http.request
...
所有这些解决方案的问题是它们需要控制cors!
【参考方案1】:
有关完整示例,请参阅 HTTP 模块的文档:
https://nodejs.org/api/http.html#http_http_request_options_callback
【讨论】:
另外值得指出的是有一个非常流行的包装库request.js
github.com/mikeal/request
http 请求是异步的,curl 是同步的。
@WHK 这就是 node.js 的本质
本站可以将你的cURL
命令转换成node.js请求:curl.trillworks.com/#node
欢迎来到现实:request 已被弃用,见 github.com/request/request/issues/3142 在我看来 http.request 有更大的潜力【参考方案2】:
用于运行服务器的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();
【讨论】:
与 OP 要求的类似卷曲的行为相比,这是非常低的水平。 致所有人:如今,请使用request
- npmjs.com/package/request - 并在下面为 Nitish 的答案投票,这是 2018 年更好的答案。
欢迎来到现实:request已被弃用,见github.com/request/request/issues/3142在我看来“低级”操作比这更有潜力,因为它一点也不低,它是BASIC【参考方案3】:
您可以轻松使用请求模块:
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)
)
【讨论】:
只是一个笔记更新,'request' 现已弃用【参考方案4】:由于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();
执行是异步的,目前没有办法同步使用它(可能永远不会有)。
它仍处于 alpha 阶段,但很快就会改变,非常感谢您的帮助。
现在可以直接使用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 ) );
另外,项目现在稳定了!
【讨论】:
我尝试安装 node-curl 和 node-libcurl,但都给了我相同的消息:“找不到 curl 的头文件。”这是在node tools/retrieve-win-deps && node tools/generate-stubs && node-gyp rebuild
步骤期间。有什么想法吗?
@GreatBigBore 你需要在你的机器上安装 libcurl 开发包。例如,如果您使用的是 debian,则可以使用 $ apt-get install libcurl4-openssl-dev
安装它
你能以某种方式使用-L
选项吗?
是的:CURLOPT_FOLLOWLOCATION,你将使用 node-libcurl curl.setOpt( 'FOLLOWLOCATION', true );
。顺便说一句,这样的问题比这个评论部分更适合issue tracker。 ;)
由于node-pre-gyp
和node v15
的依赖性问题,我未能在Ubuntu 20_04 上安装node-libcurl
。所以 lower node version 可以提供帮助,但 apt
依赖项呢?【参考方案5】:
编辑:
对于新项目,请不要使用request,因为现在项目处于维护模式,最终将被弃用
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.
)
【讨论】:
【参考方案6】:如果你真的需要 curl 等价物,你可以试试 node-curl
npm install node-curl
您可能需要添加libcurl4-gnutls-dev
。
【讨论】:
【参考方案7】:上述示例有效,但并没有真正处理现实世界的示例(即,当您处理来自多个块的数据时。您需要确保的一件事是您有一个'on chunk ' 将数据推送到数组中的处理程序(在 JS 中执行此操作的最快方式)和一个 'on end' 处理程序将它们全部连接在一起以便您可以返回它。
当您处理大型请求(超过 5000 行)并且服务器向您发送大量数据时,这尤其必要。
这是我的一个程序(coffeescript)中的一个示例: https://gist.github.com/1105888
【讨论】:
【参考方案8】:例如https://github.com/joyent/node/wiki/modules#wiki-tcp。一个非常快速的总结 =>
https://github.com/visionmedia/superagent https://github.com/mikeal/request【讨论】:
【参考方案9】:有一个 npm 模块可以发出类似 curl 的请求,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
【讨论】:
【参考方案10】:使用 request 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 中打印的所有数据
【讨论】:
【参考方案11】:使用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
请求会返回一个Promise对象,所以你必须用then
和catch
来处理结果。
reqclient
可通过 npm 获得,您可以使用以下方式安装模块:npm install reqclient
。
【讨论】:
【参考方案12】:这是一个标准库 (http
) async / await 解决方案。
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");
【讨论】:
【参考方案13】:我最终使用了grunt-shell 库。
Here 是我完全实现的 Grunt 任务的源代码,供其他考虑使用 EdgeCast API 的人使用。您会在我的示例中发现,我使用 grunt-shell 执行 curl 命令来清除 CDN。
这是我花了几个小时试图让 HTTP 请求在 Node.js 中工作后得到的结果。我能够得到一个在 Ruby 和 Python 中工作的人,但不符合这个项目的要求。
【讨论】:
【参考方案14】:您可以尝试使用 POSTMAN Chrome 应用程序来处理您的请求,并且可以从那里生成节点 js 代码
【讨论】:
【参考方案15】:我在从 IOT RaspberryPi 向云数据库发送 POST 数据时遇到问题,但几个小时后我设法解决了问题。
我使用命令提示符来执行此操作。
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 --data 内容本身按 JSON 排序
【讨论】:
【参考方案16】:Request npm 模块Request node moulde 很好用,它有get/post请求的选项设置,而且在生产环境中也被广泛使用。
【讨论】:
【参考方案17】:您可以使用请求 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.
);
【讨论】:
【参考方案18】:您可能想尝试使用类似的东西
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'));
);
【讨论】:
以上是关于Node.js 中的 cURL 等效项?的主要内容,如果未能解决你的问题,请参考以下文章
Deno 中的 Node.js 的 __dirname 和 __filename 等效项
等效于 Node.JS 的 file_get_contents()