Tôi đang tìm cách sử dụng thông tin từ một yêu cầu HTTP bằng Node.js (tức là gọi một dịch vụ web từ xa và phản hồi lại phản hồi cho khách hàng).
Trong PHP tôi đã sử dụng cURL để làm điều này. Thực hành tốt nhất trong Node là gì?
Tôi đang tìm cách sử dụng thông tin từ một yêu cầu HTTP bằng Node.js (tức là gọi một dịch vụ web từ xa và phản hồi lại phản hồi cho khách hàng).
Trong PHP tôi đã sử dụng cURL để làm điều này. Thực hành tốt nhất trong Node là gì?
Câu trả lời:
Xem tài liệu cho mô-đun HTTP để biết ví dụ đầy đủ:
https://nodejs.org/api/http.html#http_http_Vquest_options_callback
request.js
github.com/mikeal/request
cURL
lệnh của bạn thành yêu cầu của node.js: curl.trillworks.com/#node
Các http
mô-đun mà bạn sử dụng để chạy các máy chủ cũng được sử dụng để thực hiện các yêu cầu từ xa.
Đây là ví dụ trong tài liệu của họ:
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();
request
- npmjs.com/package/request - và upvote câu trả lời của Nitish, bên dưới, đây là câu trả lời tốt hơn trong năm 2018.
bạn có thể dễ dàng sử dụng mô-đun yêu cầu:
https://www.npmjs.com/package/request
Mã mẫu:
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)
}
})
Vì hình như node-curl
đã chết, tôi đã rẽ nhánh nó, đổi tên và sửa đổi để trở nên cong hơn và biên dịch trong Windows.
Ví dụ sử dụng:
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();
Thực hiện là không đồng bộ và hiện tại không có cách nào để sử dụng nó đồng bộ (và có lẽ sẽ không bao giờ có).
Nó vẫn ở dạng alpha, nhưng điều này sẽ sớm thay đổi và sự giúp đỡ được đánh giá cao.
Bây giờ có thể sử dụng Easy
xử lý trực tiếp cho các yêu cầu đồng bộ hóa, ví dụ:
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 ) );
Ngoài ra, dự án hiện đang ổn định!
node tools/retrieve-win-deps && node tools/generate-stubs && node-gyp rebuild
bước. Có suy nghĩ gì không?
$ apt-get install libcurl4-openssl-dev
-L
tùy chọn nào đó không?
curl.setOpt( 'FOLLOWLOCATION', true );
. Btw, những câu hỏi như thế phù hợp với trình theo dõi vấn đề hơn phần bình luận này. ;)
Đối với các dự án mới, vui lòng không sử dụng yêu cầu, vì hiện tại dự án đang ở chế độ tự trị, và cuối cùng sẽ bị từ chối
https://github.com/request/request/issues/3142
Thay vào đó tôi muốn giới thiệu Axios , thư viện phù hợp với các tiêu chuẩn mới nhất của Node và có một số plugin có sẵn để cải thiện nó, cho phép phản hồi của máy chủ giả, thử lại tự động và các tính năng khác.
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
});
Hoặc sử dụng async / await:
try{
const response = await axios.get('/user?ID=12345');
console.log(response)
} catch(axiosErr){
console.log(axiosErr)
}
Tôi thường sử dụng REQUEST, một ứng dụng HTTP đơn giản nhưng mạnh mẽ cho Node.js
https://github.com/request/request
Nó trên NPM
npm install request
Đây là một mẫu sử dụng:
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.
}
})
tốt nếu bạn thực sự cần một curl tương đương, bạn có thể thử node-curl
npm install node-curl
bạn có thể sẽ cần phải thêm libcurl4-gnutls-dev
.
Các ví dụ trên hoạt động nhưng không đi xa đến mức thực sự phải đối phó với một ví dụ trong thế giới thực (nghĩa là khi bạn xử lý dữ liệu thành nhiều phần. Một điều bạn cần chắc chắn là bạn có một trình xử lý 'trên chunk' đẩy dữ liệu vào một mảng (cách nhanh nhất để thực hiện điều này trong JS) và trình xử lý 'cuối cùng' kết hợp tất cả chúng lại với nhau để bạn có thể trả lại dữ liệu.
Điều này đặc biệt cần thiết khi bạn đang làm việc với các yêu cầu lớn (hơn 5000 dòng) và máy chủ sẽ gửi một loạt dữ liệu cho bạn.
Đây là một ví dụ trong một trong các chương trình của tôi (coffeescript): https://gist.github.com/1105888
Làm thế nào về ví dụ https://github.com/joyent/node/wiki/modules#wiki-tcp . Tóm tắt rất nhanh =>
Có mô-đun npm để thực hiện một yêu cầu cuộn tròn , npm curlrequest
.
Bước 1: $npm i -S curlrequest
Bước 2: Trong tệp nút của bạn
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
})
Để đọc thêm và hiểu, npm curlrequest
Sử dụng mô-đun npm yêu cầu và sau khi gọi
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.
});
Để thực hành tốt nhất cũng sử dụng một số mô-đun logston winston hoặc console.log đơn giản khác và sau đó chạy ứng dụng của bạn như
npm start output.txt
Kết quả của lệnh trên sẽ tạo một tệp txt trên root với tất cả dữ liệu mà bạn đã in trong console.log
Tôi đã kết thúc việc sử dụng thư viện grunt-shell .
Đây là ý chính nguồn của tôi cho nhiệm vụ Grunt được triển khai đầy đủ của tôi cho bất kỳ ai khác nghĩ về việc làm việc với API EdgeCast. Bạn sẽ thấy trong ví dụ của mình rằng tôi sử dụng shell grunt để thực thi lệnh curl thanh trừng CDN.
Đây là kết cục mà tôi đã kết thúc sau khi dành hàng giờ cố gắng để yêu cầu HTTP hoạt động trong Node. Tôi đã có thể có được một người làm việc trong Ruby và Python, nhưng không đáp ứng các yêu cầu của dự án này.
Sử dụng reqclient , đó là một mô-đun khách nhỏ trên đầu trang request
cho phép bạn ghi nhật ký tất cả các hoạt động với kiểu cURL (tùy chọn, cho các môi trường phát triển). Cũng có các tính năng hay như phân tích cú pháp URL và tham số, tích hợp xác thực, hỗ trợ bộ đệm, v.v.
Ví dụ: nếu bạn tạo một đối tượng máy khách, hãy thực hiện một yêu cầu:
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"}})
Nó sẽ đăng nhập trong giao diện điều khiển như thế này:
[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}
Yêu cầu sẽ trả về một đối tượng Promise , vì vậy bạn phải xử lý then
và catch
phải làm gì với kết quả.
reqclient
có sẵn với npm , bạn có thể cài đặt mô-đun với : npm install reqclient
.
Tôi gặp sự cố khi gửi dữ liệu POST lên đám mây DB từ IOT RaspberryPi, nhưng sau nhiều giờ tôi đã xoay sở được.
Tôi đã sử dụng dấu nhắc lệnh để làm như vậy.
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"}'
Dấu nhắc lệnh sẽ hiển thị các vấn đề - tên người dùng / vượt qua sai; yêu cầu xấu, vv
--URL cơ sở dữ liệu / vị trí máy chủ (Tôi đã sử dụng DB Cloudant miễn phí đơn giản) - người dùng là tên người dùng phần xác thực: pass Tôi đã nhập qua API pass -X xác định lệnh nào sẽ gọi (PUT, GET, POST, DELETE) -H loại nội dung - Cloudant là về cơ sở dữ liệu tài liệu, trong đó JSON được sử dụng - chính nội dung dữ liệu được sắp xếp dưới dạng JSON
Mô-đun yêu cầu npm Yêu cầu nút moulde rất tốt để sử dụng, nó có các cài đặt tùy chọn cho yêu cầu get / post cộng với nó cũng được sử dụng rộng rãi trong môi trường sản xuất.
Bạn có thể muốn thử sử dụng một cái gì đó như thế này
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'));
});
Bạn có thể sử dụng mô-đun npm yêu cầu. Siêu đơn giản để sử dụng. Yêu cầu được thiết kế để trở thành cách đơn giản nhất có thể để thực hiện các cuộc gọi http. Nó hỗ trợ HTTPS và theo các chuyển hướng theo mặc định.
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.
});
http.request
...