Node.js - 在HTTP GET请求查询中发送时,数组转换为对象

时间:2017-06-22 22:49:15

标签: ruby-on-rails node.js http get

以下Node.js代码:

var request = require('request');

var getLibs = function() {
    var options = { packages: ['example1', 'example2', 'example3'], os: 'linux', pack_type: 'npm' }

    request({url:'http://localhost:3000/package', qs:options}, 
    function (error , response, body) {
        if (! error && response.statusCode == 200) {
            console.log(body);
        } else if (error) {
            console.log(error);
        } else{
            console.log(response.statusCode);
        }
    });
}();

发送以下接收的http GET请求查询:

{"packages"=>{"0"=>"example1", "1"=>"example2", "2"=>"example3"}, "os"=>"linux", "pack_type"=>"npm"}

如何优化此请求,如下所示:

{"packages"=>["example1", "example2", "example3"], "os"=>"linux", "pack_type"=>"npm"}

请注意。 REST API是在Ruby on Rails中构建的

2 个答案:

答案 0 :(得分:0)

我终于找到了解决办法。我使用'qs'用'arrayFormat:'bracket'}对'options'进行字符串化,然后将其连接到以'?'结尾的url如下:

var request = require('request');
var qs1 = require('qs');

var getLibs = function() {
    var options = qs1.stringify({ 
        packages: ['example1', 'example2', 'example3'], 
        os: 'linux', 
        pack_type: 'npm' 
        },{
        arrayFormat : 'brackets'
    });


    request({url:'http://localhost:3000/package?' + options}, 
    function (error , response, body) {
        if (! error && response.statusCode == 200) {
            console.log(body);
        } else if (error) {
            console.log(error);
        } else{
            console.log(response.statusCode);
        }
    });
}();

注意:我试图避免连接到url,但所有响应都有代码400

答案 1 :(得分:0)

可以使用请求库本身解决此问题。 请求在内部使用qs.stringify。您可以传递q选项来请求将用于解析数组参数的参数。

您不需要在url后面附加内容,这会使读者有疑问为什么这样做。

参考:https://github.com/request/request#requestoptions-callback

const options = {
  method: 'GET',
  uri: 'http://localhost:3000/package',
  qs: {
    packages: ['example1', 'example2', 'example3'], 
    os: 'linux', 
    pack_type: 'npm' 
  },
  qsStringifyOptions: {
    arrayFormat: 'repeat' // You could use one of indices|brackets|repeat
  },
  json: true
};