web-dev-qa-db-ja.com

Node.jsのcURL相当?

Node.jsを使用してHTTPリクエストからの情報を使用することを探しています(つまり、リモートWebサービスを呼び出して、クライアントに応答をエコーし​​ます)。

PHPでは、これを行うためにcURLを使用していました。 Nodeのベストプラクティスは何ですか?

127
slifty

完全な例については、HTTPモジュールのドキュメントを参照してください。

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

85
Dan Grossman

サーバーを実行するために使用する 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();
64
Jeremy

リクエストモジュールを簡単に使用できます:

https://www.npmjs.com/package/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. 
  }
  else {
    console.log("Error "+response.statusCode)
  }
})
27
Nitish Agarwal

node-curl が死んでいるように見えるので、私はそれをフォークし、名前を変更し、よりカールするように変更し、Windowsでコンパイルするようにしました。

node-libcurl

使用例:

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

実行は非同期で、 現時点では同期的に使用する方法はありません(おそらく使用することはありません)。

それはまだアルファ版ですが、これはすぐに変更される予定であり、助けがありがたいです。

同期要求に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 ) );

また、プロジェクトは現在安定しています!

24
JCM

編集:

新しいプロジェクトの場合、リクエストの使用はご遠慮ください。これは、プロジェクトがmaitainanceモードになり、最終的に廃止されるためです。

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

カールの同等物が本当に必要な場合は、 node-curl を試してください。

npm install node-curl

おそらくlibcurl4-gnutls-devを追加する必要があります。

8
warfares

上記の例は機能しますが、実際の例に実際に対処するほどには進みません(つまり、複数のチャンクで受信するデータを処理する場合。データを配列にプッシュし(JSでこれを行う最も速い方法)、データをすべて結合できる「on end」ハンドラーを使用して、データを返します。

これは、大きなリクエスト(5000行以上)を処理していて、サーバーが大量のデータを送信する場合に特に必要です。

これが私のプログラムの1つの例(coffeescript)です。 https://Gist.github.com/1105888

8
Brad Dickason
7
Alfred

リクエストのようなカールを作成する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

4
Laksh Goel

リクエストnpmモジュールを使用し、呼び出し後に

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

また、ベストプラクティスとして、いくつかのwinstonロガーモジュールまたは単純なconsole.logを使用して、次のようにアプリケーションを実行します。

npm start output.txt 

上記のコマンドの結果は、console.logで印刷したすべてのデータを含むルート上に1つのtxtファイルを生成します

2
D M Patel

reqclient を使用します。これは、requestの上にある小さなクライアントモジュールであり、cURLスタイルですべてのアクティビティをログに記録できます(オプション、開発環境用)。 URLやパラメーターの解析、認証の統合、キャッシュのサポートなどの素晴らしい機能もあります。

たとえば、クライアントオブジェクトを作成してリクエストを行う場合:

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

コンソール内で次のようなログが記録されます。

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

リクエストは Promise オブジェクトを返すため、thenおよびcatchで結果をどう処理するかを処理する必要があります。

reqclientnpmで利用できます。モジュールはnpm install reqclientでインストールできます。

1
Mariano Ruiz

IOT RaspberryPiからPOSTデータをクラウドDBに送信する際に問題が発生しましたが、数時間後にはなんとか正常に取得できました。

そのためにコマンドプロンプトを使用しました。

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パスを使用して入力します-Cloudantは、JSONが使用されるドキュメントデータベースに関するものです-データコンテンツ自体はJSONとしてソートされます

1
Rudolfs

最終的に grunt-Shell ライブラリを使用しました。

ここ は、EdgeCast APIを使用することを考えている人のための、完全に実装されたGruntタスクのソースGistです。私の例では、私はgrunt-Shellを使用してcurlコマンドを実行し、CDNをパージすることがわかります。

これは、Node内で動作するHTTPリクエストを取得しようとして何時間も費やした結果、私が終わったということでした。 RubyとPythonで動作するようになりましたが、このプロジェクトの要件を満たしていませんでした。

Request npm module Request node module は使用に適しています。get/ postリクエストのオプション設定があり、実稼働環境でも広く使用されています。

1
Indrani Sen

このようなものを使用してみてください。

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
Gautam Anand

Request npm moduleを使用できます。とても使いやすい。要求は、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.
});
0
Rubin bhandari

リクエストにPOSTMAN Chromeアプリを使用してみて、そこからノードjsコードを生成できます

0
Ravi Teja