相当于Node.js中的cURL?


152

我正在寻找使用来自Node.js的HTTP请求中的信息(即调用远程Web服务并将响应回显给客户端)。

在PHP中,我会使用cURL来做到这一点。Node的最佳做法是什么?


13
http.request...
雷诺斯2011年

所有这些解决方案的问题在于它们需要控制cors!
马可(Marco)

Answers:


103

有关完整示例,请参见HTTP模块的文档:

https://nodejs.org/api/http.html#http_http_request_options_callback


10
Aslo值得指出的是,有一个非常受欢迎的包装库request.js github.com/mikeal/request
Farzher 2012年

2
http请求y异步,curl同步。
e-info128

2
@WHK这就是node.js的本质
粗暴的

我看到的最大问题是,您不能简单地输入URL并获得响应。您需要以单位分隔URL来请求它。但是诅咒可能是有办法的,为此使用一个类似curl的命令会更方便。
贾尼斯·格鲁吉斯

15
该站点可以将您的cURL命令转换为node.js请求: curl.trillworks.com/#node
Maxim Mai,

74

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

14
与OP要求的类似卷曲的行为相比,此级别非常低。
Dan Dascalescu 2013年

1
所有:如今,使用request- npmjs.com/package/request -并给予好评尼蒂什的回答,下面,这是在2018年更好的答案
丹尼森鲍姆

欢迎来到现实:请求已过时,请参阅github.com/request/request/issues/3142在我看来,“低级”操作具有更大的潜力,因为它一点也不低,是BASIC
vintproykt

35

您可以轻松使用请求模块:

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)
  }
})

27

由于看起来node-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();

Perform是异步的,当前无法同步使用(可能永远不会使用)。

它仍然处于Alpha状态,但是这种情况很快就会改变,我们非常感谢您的帮助。

现在可以Easy直接将handle用于同步请求,例如:

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步骤中。有什么想法吗?
SaganRitual 2015年

@GreatBigBore您需要在计算机上安装libcurl devel软件包。例如,如果您使用的是debian,则可以通过$ apt-get install libcurl4-openssl-dev
JCM 2015年

1
-L可以以某种方式使用该选项吗?
2015年

2
是:CURLOPT_FOLLOWLOCATION和您要使用的node-libcurl curl.setOpt( 'FOLLOWLOCATION', true );。顺便说一句,像这样的问题比此评论部分更适合问题跟踪器。;)
JCM 2015年

23

编辑:

对于新项目,请不要使用请求,因为现在该项目处于维护模式,最终将不推荐使用

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.
   }
})

9

好吧,如果您真的需要等同的卷曲度,可以尝试 node-curl

npm install node-curl

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


8

上面的示例可以正常工作,但并不能真正处理一个真实的示例(即,当您处理多个块中的数据时。您需要确保的一件事是,您需要一个“ on chunk”处理程序将数据推送到一个数组中(在JS中完成此操作的最快方法)和一个“ on end”处理程序,将它们全部连接在一起,以便您可以将其返回。

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

这是我的一个程序(咖啡脚本)中的示例:https ://gist.github.com/1105888



4

有npm模块可以使请求卷曲npm curlrequest

第1步: $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


3

使用请求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 logger模块或简单的console.log,然后像

npm start output.txt 

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


1

我最终使用了grunt-shell库。

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

这是我花了几个小时试图使HTTP请求在Node中工作后的结果。我能够使用Ruby和Python进行工作,但不满足该项目的要求。


1

使用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


1

我从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是身份验证部分的用户名:pass我通过API输入的密码pass -X定义了要调用的命令(PUT,GET,POST,DELETE)-H内容类型-Cloudant与使用JSON的文档数据库有关-数据内容本身按JSON排序



0

您可能想尝试使用类似这样的东西

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'));
});


0

您可以使用request npm module。超级简单易用。请求被设计为进行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.
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.