Node.js中的cURL等效?

sli*_*fty 135 curl node.js

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

在PHP中我会用cURL来做这件事.Node中的最佳实践是什么?

Dan*_*man 93

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

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

  • 该站点可以将您的`cURL`命令转换为node.js请求:http://curl.trillworks.com/#node (11认同)
  • 也值得指出http.get方便的方法. (10认同)
  • Aslo值得指出有一个非常流行的包装库`request.js`https://github.com/mikeal/request (10认同)
  • http请求y异步,curl同步。 (2认同)
  • @WHK这就是node.js的本质 (2认同)

小智 71

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();
Run Code Online (Sandbox Code Playgroud)

  • 与OP要求的类似卷曲的行为相比,这是非常低的水平. (13认同)
  • 欢迎来到现实:request 已被弃用,请参阅 https://github.com/request/request/issues/3142 在我看来,“低级”操作比这更有潜力,因为它一点也不低,它是 BASIC (5认同)

Nit*_*wal 30

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

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)
  }
})
Run Code Online (Sandbox Code Playgroud)

  • 这就是我编写示例代码的原因 (9认同)
  • 只是一个注释更新,“请求”现已弃用 (2认同)

JCM*_*JCM 25

由于看起来像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();
Run Code Online (Sandbox Code Playgroud)

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 ) );
Run Code Online (Sandbox Code Playgroud)

此外,该项目现在稳定!

  • 是的:[CURLOPT_FOLLOWLOCATION](http://curl.haxx.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html),使用node-libcurl,你将使用``curl.setOpt('FOLLOWLOCATION',true);``.顺便说一下,这个问题比这个评论部分更适合[问题跟踪器](https://github.com/JCMais/node-libcurl/issues).;) (2认同)

Aro*_*ano 15

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

https://github.com/request/request

它在NPM上 npm install request

这是一个用法示例:

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
  });
Run Code Online (Sandbox Code Playgroud)


Bra*_*son 8

上面的例子可以工作但是没有真正处理真实世界的例子(即当你处理多个块的数据时.你需要确定的一件事是你有一个'on chunk'处理程序,将数据推送到一个数组(在JS中以最快的方式执行此操作)和一个将它们连接在一起的"on end"处理程序,以便您可以返回它.

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

这是我的一个程序(coffeescript)中的一个例子:https://gist.github.com/1105888


小智 8

好吧,如果你真的需要卷曲等效,你可以尝试 node-curl

npm install node-curl
Run Code Online (Sandbox Code Playgroud)

你可能需要添加libcurl4-gnutls-dev.


小智 5

在 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);
}
Run Code Online (Sandbox Code Playgroud)