setara dengan CURL di Node.js?

152

Saya mencari untuk menggunakan informasi dari permintaan HTTP menggunakan Node.js (mis. Panggil layanan web jarak jauh dan gema respons ke klien).

Dalam PHP saya akan menggunakan cURL untuk melakukan ini. Apa praktik terbaik di Node?

licin
sumber
13
http.request...
Raynos
Masalah dengan semua solusi ini adalah bahwa mereka memerlukan kendali atas kor!
Marco

Jawaban:

103

Lihat dokumentasi untuk modul HTTP untuk contoh lengkap:

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

Dan Grossman
sumber
10
Sedap juga menunjukkan ada perpustakaan wrapper yang sangat populer request.js github.com/mikeal/request
Farzher
2
http request y async, curl disinkronkan.
e-info128
2
@WHK adalah sifat dari node.js
slifty
Masalah besar yang saya lihat dengan ini adalah, Anda tidak bisa hanya memasukkan URL dan mendapatkan respons. Anda perlu memisahkan URL dalam unit untuk memintanya. Tapi dari kutukan mungkin ada caranya, itu hanya akan lebih nyaman untuk menggunakan satu perintah seperti ikal untuk ini.
Jānis Gruzis
15
Situs ini dapat mengonversi cURLperintah Anda menjadi permintaan node.js: curl.trillworks.com/#node
Maxim Mai
74

The httpmodul yang Anda gunakan untuk menjalankan server juga digunakan untuk membuat permintaan terpencil.

Inilah contoh dalam dokumen mereka:

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();
Jeremy Banks
sumber
14
Level ini sangat rendah dibandingkan dengan perilaku seperti ikal yang diminta OP.
Dan Dascalescu
1
Kepada Semua: Saat ini, gunakan request- npmjs.com/package/request - dan pilih jawaban Nitish, di bawah, yang merupakan jawaban yang lebih baik pada tahun 2018.
Dan Nissenbaum
Selamat datang di kenyataan: permintaan telah ditinggalkan, lihat github.com/request/request/issues/3142 Menurut saya, operasi "tingkat rendah" memiliki lebih banyak potensi daripada ini, karena sama sekali tidak rendah, BASIC
vintproykt
35

Anda dapat dengan mudah menggunakan modul permintaan:

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

Kode sampel:

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)
  }
})
Nitish Agarwal
sumber
27

Karena sepertinya node-curlsudah mati, saya telah memotongnya, berganti nama, dan dimodifikasi agar lebih seperti ikal dan untuk dikompilasi di bawah Windows.

node-libcurl

Contoh penggunaan:

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

Perform adalah async, dan tidak ada cara untuk menggunakannya secara sinkron saat ini (dan mungkin tidak akan pernah ada).

Itu masih dalam alpha, tetapi ini akan segera berubah, dan bantuan sangat dihargai.

Sekarang dimungkinkan untuk menggunakan Easypegangan secara langsung untuk permintaan sinkronisasi, contoh:

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

Juga, proyeknya stabil sekarang!

JCM
sumber
Saya mencoba menginstal node-curl dan node-libcurl, tetapi keduanya memberi saya pesan yang sama: "Tidak dapat menemukan file header curl." Ini selama node tools/retrieve-win-deps && node tools/generate-stubs && node-gyp rebuildlangkah. Adakah pikiran?
SaganRitual
@GreatBigBore Anda perlu paket libcurl devel yang diinstal pada mesin Anda. Jika Anda menggunakan debian misalnya, Anda dapat menginstalnya dengan$ apt-get install libcurl4-openssl-dev
JCM
1
dapatkah Anda menggunakan -Lopsi ini?
hidup
2
Ya: CURLOPT_FOLLOWLOCATION , dengan node-libcurl yang akan Anda gunakan curl.setOpt( 'FOLLOWLOCATION', true );. Btw, pertanyaan seperti itu lebih cocok untuk pelacak masalah daripada bagian komentar ini. ;)
JCM
23

EDIT:

Untuk proyek baru, harap jangan menggunakan permintaan, karena sekarang proyek dalam mode maitainance, dan pada akhirnya akan usang

https://github.com/request/request/issues/3142

Alih-alih saya akan merekomendasikan Axios , perpustakaan ini sejalan dengan Node standar terbaru, dan ada beberapa plugin yang tersedia untuk meningkatkannya, memungkinkan tanggapan server tiruan, coba ulang otomatis dan fitur lainnya.

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

Atau menggunakan async / tunggu:

try{
    const response = await axios.get('/user?ID=12345');
    console.log(response)
} catch(axiosErr){
    console.log(axiosErr)
}

Saya biasanya menggunakan REQUEST, ini klien HTTP yang disederhanakan tetapi kuat untuk Node.js

https://github.com/request/request

Di NPM npm install request

Berikut ini adalah contoh penggunaan:

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.
   }
})
Aronis Mariano
sumber
9

nah kalau kamu benar-benar membutuhkan ikal yang setara kamu bisa coba node-curl

npm install node-curl

Anda mungkin perlu menambahkan libcurl4-gnutls-dev.

peperangan
sumber
8

Contoh-contoh di atas bekerja tetapi jangan sampai benar-benar berurusan dengan contoh dunia nyata (yaitu ketika Anda memproses data yang datang dalam beberapa potongan. Satu hal yang perlu Anda pastikan adalah bahwa Anda memiliki penangan 'on chunk' yang dorong data ke dalam array (cara tercepat untuk melakukan ini di JS) dan penangan 'on-end' yang menggabungkan semuanya jadi Anda bisa mengembalikannya.

Ini sangat diperlukan ketika Anda bekerja dengan permintaan besar (5000+ baris) dan server mengirimkan banyak data kepada Anda.

Berikut ini contoh di salah satu program saya (coffeescript): https://gist.github.com/1105888

Brad Dickason
sumber
4

Ada modul npm untuk membuat permintaan seperti ikal npm curlrequest,.

Langkah 1: $npm i -S curlrequest

Langkah 2: Di file simpul Anda

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

Untuk membaca dan memahami lebih lanjut, npm curlrequest

Laksh Goel
sumber
3

Gunakan modul permintaan npm dan setelah panggilan

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

Untuk praktik terbaik juga gunakan beberapa modul winston logger atau console.log sederhana dan kemudian jalankan aplikasi Anda seperti

npm start output.txt 

Hasil dari perintah di atas akan menghasilkan satu file txt di root dengan semua data yang telah Anda cetak di console.log

DM Patel
sumber
1

Saya akhirnya menggunakan perpustakaan grunt-shell .

Inilah inti sumber saya untuk tugas Grunt yang diimplementasikan sepenuhnya untuk siapa pun yang berpikir untuk bekerja dengan EdgeCast API. Anda akan menemukan dalam contoh saya bahwa saya menggunakan grunt-shell untuk menjalankan perintah curl yang membersihkan CDN.

Ini yang akhirnya saya lakukan setelah menghabiskan berjam-jam mencoba untuk mendapatkan permintaan HTTP untuk bekerja dalam Node. Saya bisa mendapatkan satu yang berfungsi di Ruby dan Python, tetapi tidak memenuhi persyaratan proyek ini.

strawberryMarshmallow
sumber
1

Menggunakan reqclient , ini adalah modul klien kecil requestyang memungkinkan Anda untuk mencatat semua aktivitas dengan gaya cURL (opsional, untuk lingkungan pengembangan). Juga memiliki fitur-fitur bagus seperti penguraian URL dan parameter, integrasi otentikasi, dukungan cache, dll.

Misalnya, jika Anda membuat objek klien, lakukan permintaan:

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

Ini akan masuk dalam konsol seperti ini:

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

Permintaan akan mengembalikan objek Janji , jadi Anda harus menangani thendan catchapa yang harus dilakukan dengan hasilnya.

reqclienttersedia dengan NPM , Anda dapat menginstal modul dengan: npm install reqclient.

Mariano Ruiz
sumber
1

Saya punya masalah mengirim data POST ke cloud DB dari IOT RaspberryPi, tetapi setelah berjam-jam saya berhasil meluruskannya.

Saya menggunakan command prompt untuk melakukannya.

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

Command prompt akan menunjukkan masalah - nama pengguna / pass salah; permintaan buruk dll

--URL basis data / lokasi server (Saya menggunakan DB Cloudant gratis sederhana) --user adalah bagian otentikasi nama pengguna: pass yang saya masukkan melalui API pass -X mendefinisikan perintah untuk memanggil apa (PUT, GET, POST, DELETE) -H tipe konten - Cloudant adalah tentang basis data dokumen, di mana JSON digunakan - konten data itu sendiri diurutkan sebagai JSON

Rudolfs
sumber
1

Request npm module Request node moulde baik untuk digunakan, ia memiliki opsi pengaturan untuk mendapatkan / mengirim permintaan plus itu banyak digunakan dalam lingkungan produksi juga.

Indrani Sen
sumber
0

Anda mungkin ingin mencoba menggunakan sesuatu seperti ini

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'));
});
Gautam Anand
sumber
0

Anda dapat mencoba menggunakan aplikasi POSTMAN Chrome untuk permintaan Anda dan Anda dapat menghasilkan kode node js dari sana

Ravi Teja
sumber
0

Anda dapat menggunakan modul permintaan npm. Sangat mudah digunakan. Permintaan dirancang untuk menjadi cara paling sederhana untuk melakukan panggilan http. Ini mendukung HTTPS dan mengikuti pengalihan secara default.

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.
});
Rubin bhandari
sumber