Node.js'de cURL eşdeğeri?


152

Node.js kullanarak bir HTTP isteğinden bilgi kullanmak istiyorum (yani uzak bir web hizmetini arayın ve istemciye yanıtı yankı).

PHP bunu yapmak için cURL kullanırdım. Düğümdeki en iyi uygulama nedir?


13
http.request...
Raynos

Tüm bu çözümlerin sorunu, cors kontrolünü gerektirmeleri!
Marco

Yanıtlar:


103

Tam bir örnek için HTTP modülünün belgelerine bakın:

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


10
Aslo işaret etmeye değer çok popüler bir sarıcı kütüphane var request.js github.com/mikeal/request
Farzher

2
http request y async, curl eşittir.
e-info128

2
@WHK, node.js'nin doğasıdır
13'te

Bununla ilgili gördüğüm en büyük sorun, URL'yi girip yanıt alamamanızdır. URL'yi istemek için birimler halinde ayırmanız gerekir. Ancak lanet olası bir yol var, bunun için bir kıvrım benzeri komut kullanmak daha uygun olurdu.
Jānis Gruzis

15
Bu site cURLkomutunuzu node.js isteğine dönüştürebilir : curl.trillworks.com/#node
Maxim Mai

74

httpEğer sunucuları çalıştırmak için kullandığı modül aynı zamanda uzak isteklerini yapmak için kullanılır.

Dokümanlarındaki örnek:

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
Bu OP'nin istediği kıvrılma benzeri davranışa kıyasla çok düşük düzeydedir.
Dan Dascalescu

1
Herkese : Bugünlerde request- npmjs.com/package/request - kullanın ve 2018'de daha iyi bir cevap olan aşağıdaki Nitish'in cevabını
oylayın.

Gerçekliğe hoş geldiniz: istek reddedildi, bkz. Github.com/request/request/issues/3142 Bana "düşük seviyeli" operasyonun bundan daha fazla potansiyele sahip olduğunu söylüyor, çünkü hiç de düşük değil, BASIC
vintproykt

35

istek modülünü kolayca kullanabilirsiniz:

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

Basit kod:

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

Görünüşe node-curlgöre ölü olduğu için çatalladım, yeniden adlandırdım ve daha kıvrımlı olacak ve Windows altında derleyecek şekilde değiştirdim.

node-libcurl

Kullanım örneği:

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 zaman uyumsuzdur ve şu anda senkronize kullanmanın bir yolu yoktur (ve muhtemelen hiçbir zaman sahip olmayacaktır).

Hala alfa, ama bu yakında değişecek ve yardım takdir edilecektir.

Artık Easysenkronizasyon istekleri için tanıtıcıyı doğrudan kullanmak mümkündür , örnek:

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

Ayrıca, proje şimdi kararlı!


Hem node-curl hem de node-libcurl'i yüklemeyi denedim, ancak her ikisi de bana aynı mesajı veriyor: "Curl'un başlık dosyası bulunamıyor." Bu node tools/retrieve-win-deps && node tools/generate-stubs && node-gyp rebuildadım sırasında . Düşüncesi olan var mı?
SaganRitüel

Makinenizde libcurl devel paketine ihtiyacınız var. Örneğin debian kullanıyorsanız$ apt-get install libcurl4-openssl-dev
JCM

1
-Lseçeneği bir şekilde kullanabilir misin ?
corvid

2
Evet: CURLOPT_FOLLOWLOCATION , düğüm libcurl ile kullanacaksınız curl.setOpt( 'FOLLOWLOCATION', true );. Btw, bunun gibi sorular, sorun izleyiciye bu yorum bölümünden daha uygundur . ;)
JCM

23

DÜZENLE:

Yeni projeler için lütfen istek kullanmaktan kaçının, çünkü proje bakım modunda ve sonunda kullanımdan kaldırılacak

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

Bunun yerine Axios'u tavsiye ederim , kütüphane Node en son standartlarına uygundur ve bunu geliştirmek için bazı eklentiler vardır, sahte sunucu yanıtları, otomatik yeniden denemeler ve diğer özellikler sağlanır.

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

Veya async / await kullanarak:

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

Genellikle REQUEST, Node.js için basitleştirilmiş ama güçlü bir HTTP istemcisi kullanıyorum

https://github.com/request/request

NPM'de npm install request

İşte bir kullanım örneği:

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

gerçekten bir kıvrılma eşdeğerine ihtiyacınız varsa deneyebilirsiniz node-curl

npm install node-curl

muhtemelen eklemeniz gerekecek libcurl4-gnutls-dev.


8

Yukarıdaki örnekler işe yarıyor ancak gerçek bir dünya örneğiyle gerçekten ilgilenecek kadar ileri gitmeyin (örneğin, birden fazla parça halinde gelen verileri işlediğinizde. Emin olmanız gereken bir şey, 'yığın' işleyicisine sahip olmanızdır. verileri bir diziye (bunu JS'de yapmanın en hızlı yolu) ve hepsini bir araya getiren bir 'son' işleyiciye geri gönderebilirsiniz.

Bu, özellikle büyük isteklerle (5000+ satır) çalışırken ve sunucu size bir grup veri gönderdiğinde gereklidir.

Programlarımdan birinde (kahve) bir örnek: https://gist.github.com/1105888



4

Kıvrım benzeri bir istekte bulunmak için npm modülü vardır npm curlrequest.

Aşama 1: $npm i -S curlrequest

Adım 2: Düğüm dosyanızda

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

Daha fazla okuma ve anlama için npm curlrequest


3

İstek npm modülünü ve çağrı sonrası kullanın

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

En iyi uygulama için bazı winston logger modülünü veya basit bir console.log kullanın ve ardından uygulamanızı aşağıdaki gibi çalıştırın

npm start output.txt 

Yukarıdaki komutun sonucu, console.log'da yazdırdığınız tüm verileri içeren kökte bir txt dosyası oluşturur


1

Ben kullanarak sona erdi hırıltı-kabuk kütüphanesi.

İşte EdgeCast API ile çalışmayı düşünen herkes için tam olarak uygulanmış Grunt görevim için kaynak özgeçmişim. Örneğimde, CDN'yi temizleyen curl komutunu yürütmek için bir homurdanma kabuğu kullandığımı göreceksiniz.

Bu, Düğüm içinde çalışmak için bir HTTP isteği almaya çalışırken saatler geçirdikten sonra sona erdi. Biri Ruby ve Python'da çalıştırabildim, ancak bu projenin gereksinimlerini karşılamadım.


1

Reqclient kullanır , tüm etkinliği cURL stiliyle (geliştirme ortamları için isteğe bağlı) requestkaydetmenizi sağlayan küçük bir istemci modülüdür . URL ve parametre ayrıştırma, kimlik doğrulama entegrasyonları, önbellek desteği vb.Gibi güzel özelliklere de sahiptir.

Örneğin, bir istemci nesnesi oluşturursanız bir istekte bulunun:

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

Konsol içinde şöyle bir şey kaydeder:

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

İstek bir Promise nesnesi döndürür , bu nedenle sonuçla başa çıkmanız thenve bununla catchne yapmanız gerekir .

reqclientile kullanılabilir NPM , sizinle modülü yükleyebilirsiniz: npm install reqclient.


1

IOT RaspberryPi'den bulut DB'ye POST verileri gönderirken bir sorun yaşadım, ancak saatlerden sonra düzleştirmeyi başardım.

Bunu yapmak için komut istemini kullandım.

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

Komut istemi sorunları gösterecektir - yanlış kullanıcı adı / geçiş; kötü istek vb.

--URL veritabanı / sunucu konumu (Ben basit ücretsiz Cloudant DB kullandım) - kullanıcı kimlik doğrulama kısmı kullanıcı adı: pass API ile girdiğim pass -X hangi komutu çağırmak için tanımlar (PUT, GET, POST, DELETE) -H içerik türü - Cloudant, JSON'un kullanıldığı belge veritabanı ile ilgilidir - veri içeriğinin kendisi JSON olarak sıralanmıştır



0

Böyle bir şey kullanmayı denemek isteyebilirsiniz

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

İsteğiniz için POSTMAN Chrome uygulamasını kullanmayı deneyebilir ve oradan düğüm js kodu oluşturabilirsiniz


0

İstek npm modülünü kullanabilirsiniz. Kullanımı çok basit. İstek, http aramaları yapmanın mümkün olan en basit yolu olacak şekilde tasarlanmıştır. HTTPS'yi destekler ve varsayılan olarak yönlendirmeleri takip eder.

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.
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.