Node.jsで同等のcURL?


152

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

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


13
http.request...
レイノス'25

これらすべてのソリューションの問題は、コアの制御が必要なことです。
マルコ

回答:


103

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

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


10
非常に人気のあるラッパーライブラリrequest.js github.com/mikeal/request
Farzher

2
httpリクエストy非同期、curlは同期。
e-info128 2013

2
@WHKがnode.jsの性質です
2013

これで私が目にする大きな問題は、単にURLを入力して応答を取得できないことです。リクエストするには、URLをユニットで区切る必要があります。しかし、呪いについてはおそらく方法があります。これには、1つのcurlのようなコマンドを使用する方が便利です。
ジャニスGruzis

15
このサイトはcURLコマンドをnode.jsリクエストに変換できます: curl.trillworks.com/#node
Maxim Mai

74

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

14
これは、OPが要求したカールのような動作に比べて非常に低いレベルです。
Dan Dascalescu 2013

1
今日では、使用:すべてにrequest- npmjs.com/package/request -とupvote Nitishの答え、以下、2018年でより良い答えです
ダンNissenbaum

現実へようこそ:要求が廃止されましたが、見github.com/request/request/issues/3142は、それがすべてでは低くはないので、「低レベル」の操作はこれ以上の可能性があるように私には思われるが、それのBASIC
vintproykt

35

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

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

node-curl死んでいるように見えるので、私はそれをforkし、名前を変更して、よりカールのようになり、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 ) );

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


node-curlとnode-libcurlの両方をインストールしようとしましたが、どちらも「curlのヘッダーファイルが見つかりません」という同じメッセージを表示します。これはnode tools/retrieve-win-deps && node tools/generate-stubs && node-gyp rebuildステップ中です。何かご意見は?
SaganRitual 2015

@GreatBigBoreあなたのマシンにlibcurl develパッケージがインストールされている必要があります。あなたが例えばDebianのを使用している場合は、あなたがそれをインストールすることができます$ apt-get install libcurl4-openssl-dev
JCM

1
-Lどういうわけかオプションを使用できますか?
corvid

2
はい:CURLOPT_FOLLOWLOCATION、ノードのlibcurlであなたが使用しようとしていますcurl.setOpt( 'FOLLOWLOCATION', true );。ところで、そのような質問は、このコメントセクションよりも課題追跡に適しています。;)
JCM 2015年

23

編集:

新しいプロジェクトの場合、リクエストは使用しないでください。プロジェクトはマイテナンスモードになり、最終的には廃止される予定です。

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を使用します。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.
   }
})

9

まああなたが本当にカール相当物を必要とするならあなたは試すことができます node-curl

npm install node-curl

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


8

上記の例は機能しますが、実際の例(つまり、複数のチャンクで受信するデータを処理する場合)を実際に扱うことはしません。確認する必要があることの1つは、データを配列にプッシュし(JSでこれを行う最速の方法)、それらをすべて結合する「オンエンド」ハンドラーでデータを返すことができます。

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

これは私のプログラム(coffeescript)の例です:https ://gist.github.com/1105888



4

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


3

リクエスト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ファイルをルートに生成します


1

ついにgrunt-shellライブラリを使用することになりました。

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

これは、Node内でHTTPリクエストを機能させるために何時間も費やした後で終わったということです。RubyとPythonで動作させることはできましたが、このプロジェクトの要件を満たしていませんでした。


1

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オブジェクトを返すため、結果thencatchどのように処理するかを処理する必要があります。

reqclientnpmで利用可能です。次のコマンドでモジュールをインストールできますnpm install reqclient


1

IOST 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パスを介して入力しました-Xは呼び出すコマンドを定義します(PUT、GET、POST、DELETE)-Hコンテンツタイプ-Cloudantは、JSONが使用されるドキュメントデータベースに関するものです-データコンテンツ自体がJSONとしてソートされます



0

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

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

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


0

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.
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.