我希望使用Node.js的HTTP请求中的信息(即调用远程Web服务并回应客户端的响应)。
在PHP中我会用cURL来做这件事。 Node中的最佳实践是什么?
答案 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下进行编译。
用法示例:
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)
答案 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)
答案 7 :(得分:7)
例如https://github.com/joyent/node/wiki/modules#wiki-tcp怎么样?一个非常快速的摘要=>
答案 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'));
});