Node.js中的cURL等效?

时间:2011-07-25 16:13:01

标签: curl node.js

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

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

18 个答案:

答案 0 :(得分:83)

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

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

答案 1 :(得分:64)

用于运行服务器的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();

答案 2 :(得分:24)

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

此外,该项目现在稳定了!

答案 3 :(得分:24)

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

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

示例代码:

UINavigationController

答案 4 :(得分:13)

编辑:

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

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

或使用async / await:

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

答案 5 :(得分:8)

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

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

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

答案 6 :(得分:8)

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

npm install node-curl

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

答案 7 :(得分:7)

答案 8 :(得分: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

答案 9 :(得分:2)

使用请求npm模块并在通话后

<input type="hidden" name="csrf-token" value="{{ csrf_token() }}">

'X-CSRF-TOKEN': $('input[name="csrf-token"]').val()

为了获得最佳实践,还可以使用一些 winston 记录器模块或简单的console.log,然后运行您的应用程序,如

devtools::install_github("rstudio/keras")
Error in loadNamespace(j <- i[[1L]], c(lib.loc, .libPaths()), versionCheck = vI[[j]]) : 
  namespace 'Rcpp' 0.12.4 is being loaded, but >= 0.12.7 is required
ERROR: lazy loading failed for package 'reticulate'
* removing 'C:/Anaconda3/R/library/reticulate'
Error: Command failed (1)

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

答案 10 :(得分:1)

这是标准的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");

答案 11 :(得分:1)

请求npm模块Request node moulde很好用,它有get / post请求的选项设置,而且它也广泛用于生产环境。

答案 12 :(得分: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传递输入 -X定义要调用的命令(PUT,GET,POST,DELETE) -H内容类型 - Cloudant是关于文档数据库,使用JSON - 数据内容本身排序为JSON

答案 13 :(得分:1)

使用reqclient,它是[{ 'page':'ProductPage', 'OAM':'False', 'storeNum':'029', 'brand':'ASUS', 'productPrice':'199.99', 'SKU':'576181', 'productID':'443759', 'mpn':'RT-AC3200', 'ean':'886227780914', 'category':'Wireless Routers', 'isMobile':'False' }] [{ 'page':'ProductPage', 'OAM':'False', 'storeNum':'029', 'brand':'Linksys', 'productPrice':'79.99', 'SKU':'244129', 'productID':'432549', 'mpn':'EA6350', 'ean':'745883644780', 'category':'Wireless Routers', 'isMobile':'False' }] 之上的小型客户端模块,允许您使用cURL样式记录所有活动(可选,适用于开发环境)。还有很好的功能,如URL和参数解析,身份验证集成,缓存支持等。

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

request

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

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

请求将返回Promise个对象,因此您必须处理[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} then如何处理结果。

catch可与 npm 一起使用,您可以使用以下代码安装模块:reqclient

答案 14 :(得分:1)

我最终使用了grunt-shell库。

对于考虑使用EdgeCast API的其他人来说,

Here是我完全实现的Grunt任务的源头要点。在我的例子中你会发现我使用grunt-shell来执行清除CDN的curl命令。

这是我花了好几个小时试图让HTTP请求在Node中工作后结束的。我能够使用Ruby和Python工作,但不符合这个项目的要求。

答案 15 :(得分:0)

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

答案 16 :(得分:0)

您可以使用请求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.
});

答案 17 :(得分: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'));
});