tương đương cURL trong Node.js?


152

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ì?


13
http.request...
Raynos

Vấn đề với tất cả các giải pháp này là chúng đòi hỏi phải kiểm soát các cors!
Marco

Câu trả lời:


103

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


10
Cũng đáng để chỉ ra rằng có một thư viện trình bao bọc rất phổ biến request.js github.com/mikeal/request
Farzher

2
http yêu cầu y async, curl là đồng bộ.
điện tử ngày

2
@WHK đó là bản chất của node.js
slifty

Vấn đề lớn tôi thấy với điều này là, bạn không thể chỉ cần nhập URL và nhận được phản hồi. Bạn cần tách URL theo đơn vị để yêu cầu nó. Nhưng lời nguyền có lẽ có một cách, nó sẽ thuận tiện hơn để sử dụng một lệnh uốn cong như thế này.
Jāni Gruzis

15
Trang web này có thể chuyển đổi cURLlệnh của bạn thành yêu cầu của node.js: curl.trillworks.com/#node
Maxim Mai

74

Các httpmô-đ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();

14
Đây là mức rất thấp so với hành vi giống như curl mà OP yêu cầu.
Dan Dascalescu

1
Đối với tất cả: Ngày nay, hãy sử dụng 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.
Dan Nissenbaum

Chào mừng bạn đến với thực tế: yêu cầu đã không được chấp nhận, xem github.com/request/request/issues/3142 Dường như với tôi rằng hoạt động "cấp thấp" có tiềm năng hơn thế này, bởi vì nó không hề thấp, đó là BASIC
vintproykt

35

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

27

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.

node-libcurl

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 Easyxử 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!


Tôi đã thử cài đặt cả nút-curl và nút-libcurl, nhưng cả hai đều cho tôi cùng một thông báo: "Không thể tìm thấy tệp tiêu đề của curl." Đây là trong node tools/retrieve-win-deps && node tools/generate-stubs && node-gyp rebuildbước. Có suy nghĩ gì không?
SaganRitual

@GreatBigBore bạn cần gói libcurl được cài đặt trên máy của bạn. Nếu bạn đang sử dụng debian chẳng hạn, bạn có thể cài đặt nó với$ apt-get install libcurl4-openssl-dev
JCM

1
bạn có thể sử dụng -Ltùy chọn nào đó không?
corvid

2
Có: CURLOPT_FOLLOWLOCATION , với nút-libcurl bạn sẽ sử dụ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. ;)
JCM

23

BIÊN TẬP:

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

9

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.


8

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



4

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


3

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


1

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.


1

Sử dụng reqclient , đó là một mô-đun khách nhỏ trên đầu trang requestcho 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ý thencatchphải làm gì với kết quả.

reqclientcó sẵn với npm , bạn có thể cài đặt mô-đun với : npm install reqclient.


1

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



0

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

0

Bạn có thể thử sử dụng ứng dụng POSTMAN Chrome cho yêu cầu của mình và bạn có thể tạo mã js nút từ đó


0

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.
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.