node.js http 'クエリ文字列パラメータを使用した' get 'リクエスト


83

httpクライアントであるNode.jsアプリケーションがあります(現時点では)。だから私はやっています:

var query = require('querystring').stringify(propertiesObject);
http.get(url + query, function(res) {
   console.log("Got response: " + res.statusCode);
}).on('error', function(e) {
    console.log("Got error: " + e.message);
});

これは、これを達成するのに十分な方法のようです。しかし、私はそのurl + queryステップをしなければならなかったことに少し不安を感じています。これは共通のライブラリによってカプセル化される必要がありますが、これがノードのhttpライブラリに存在することはまだわかりません。また、どの標準npmパッケージがそれを実現できるかわかりません。より良い、合理的に広く使用されている方法はありますか?

url.formatメソッドは、独自のURLを作成する手間を省きます。しかし、理想的には、リクエストはこれよりも高いレベルになります。



回答:


158

リクエストモジュールをチェックしてください。

これは、ノードの組み込みhttpクライアントよりもフル機能です。

var request = require('request');

var propertiesObject = { field1:'test1', field2:'test2' };

request({url:url, qs:propertiesObject}, function(err, response, body) {
  if(err) { console.log(err); return; }
  console.log("Get response: " + response.statusCode);
});

典型的なpropertiesObjectはどのように見えますか?これを機能させることができません
user264230 2014年

3
qsはクエリ文字列キーです。したがって、クエリ文字列に必要なフィールドは何でもかまいません。{field1: 'test1'、field2: 'test2'}
ダニエル

Nodejsコアhttpモジュールだけでこれを行う方法を知っている人はいますか?
アレクサンダーミルズ

1
@AlexanderMillsは私の答えを見てください。サードパーティのライブラリは必要ありません。
JustinMeiners19年

8
リクエストモジュールは古くなり、非推奨になりました。
AmiNadimi

19

サードパーティのライブラリは必要ありません。nodejs urlモジュールを使用して、クエリパラメータを使用してURLを作成します。

const requestUrl = url.parse(url.format({
    protocol: 'https',
    hostname: 'yoursite.com',
    pathname: '/the/path',
    query: {
        key: value
    }
}));

次に、フォーマットされたURLを使用してリクエストを行います。requestUrl.pathクエリパラメータが含まれます。

const req = https.get({
    hostname: requestUrl.hostname,
    path: requestUrl.path,
}, (res) => {
   // ...
})

組み込みを使用する既存のコードを使用したいので、このソリューションを試して使用しますhttpsが、OPは、クエリを使用してURL文字列を作成するための高レベルの抽象化やライブラリを要求したため、受け入れられたと思います答えは個人的にもっと有効です
スコットアンダーソン

2
@ScottAnderson受け入れられた答えでなくても大丈夫です。人々が必要なことを成し遂げるのを手伝いたいだけです。それがあなたを助けることができてうれしいです。
Justin Meiners

6

外部パッケージを使用したくない場合は、ユーティリティに次の関数を追加するだけです。

var params=function(req){
  let q=req.url.split('?'),result={};
  if(q.length>=2){
      q[1].split('&').forEach((item)=>{
           try {
             result[item.split('=')[0]]=item.split('=')[1];
           } catch (e) {
             result[item.split('=')[0]]='';
           }
      })
  }
  return result;
}

次に、createServerコールバックで、オブジェクトに属性paramsを追加しrequestます。

 http.createServer(function(req,res){
     req.params=params(req); // call the function above ;
      /**
       * http://mysite/add?name=Ahmed
       */
     console.log(req.params.name) ; // display : "Ahmed"

})

2
OPの質問は、httpサーバーではなく、httpクライアントに関するものです。この回答は、httpリクエストのクエリ文字列をエンコードするのではなく、httpサーバーでクエリ文字列を解析する場合に関連します。
Stephen Schaub 2017

これは、質問が尋ねていたのとは逆のことを行っています。また、これを自分で解析しようとするよりも、Nodeの組み込みquerystringモジュールを使用する方が適切です。
peterflynn

6

クエリ文字列パラメータをURLに追加する方法に苦労しています。?URLの最後に追加する必要があることに気付くまで、それを機能させることができませんでした。そうしないと、機能しません。これはデバッグの時間を節約するので非常に重要です、私を信じてください:そこにいました...それをしました

以下は、呼び出す単純なAPIエンドポイントでオープン天気APIをして渡しAPPIDlatおよびlonなどのクエリパラメータと戻り気象データなどのJSONオブジェクトが。お役に立てれば。

//Load the request module
var request = require('request');

//Load the query String module
var querystring = require('querystring');

// Load OpenWeather Credentials
var OpenWeatherAppId = require('../config/third-party').openWeather;

router.post('/getCurrentWeather', function (req, res) {
    var urlOpenWeatherCurrent = 'http://api.openweathermap.org/data/2.5/weather?'
    var queryObject = {
        APPID: OpenWeatherAppId.appId,
        lat: req.body.lat,
        lon: req.body.lon
    }
    console.log(queryObject)
    request({
        url:urlOpenWeatherCurrent,
        qs: queryObject
    }, function (error, response, body) {
        if (error) {
            console.log('error:', error); // Print the error if one occurred

        } else if(response && body) {
            console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
            res.json({'body': body}); // Print JSON response.
        }
    })
})  

または、querystringモジュールを使用する場合は、次の変更を加えます

var queryObject = querystring.stringify({
    APPID: OpenWeatherAppId.appId,
    lat: req.body.lat,
    lon: req.body.lon
});

request({
   url:urlOpenWeatherCurrent + queryObject
}, function (error, response, body) {...})

1

あなたが送信する必要がある場合GETに、要求をIPだけでなく、Domain(他の答えはあなたが指定することができます言及しなかったport変数)を、あなたはこの機能を利用することができます。

function getCode(host, port, path, queryString) {
    console.log("(" + host + ":" + port + path + ")" + "Running httpHelper.getCode()")

    // Construct url and query string
    const requestUrl = url.parse(url.format({
        protocol: 'http',
        hostname: host,
        pathname: path,
        port: port,
        query: queryString
    }));

    console.log("(" + host + path + ")" + "Sending GET request")
    // Send request
    console.log(url.format(requestUrl))
    http.get(url.format(requestUrl), (resp) => {
        let data = '';

        // A chunk of data has been received.
        resp.on('data', (chunk) => {
            console.log("GET chunk: " + chunk);
            data += chunk;
        });

        // The whole response has been received. Print out the result.
        resp.on('end', () => {
            console.log("GET end of response: " + data);
        });

    }).on("error", (err) => {
        console.log("GET Error: " + err);
    });
}

ファイルの先頭にモジュールを要求することをお見逃しなく:

http = require("http");
url = require('url')

またhttps、セキュリティで保護されたネットワークを介して通信するためにモジュールを使用できることにも注意してください。

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