Search code examples
ruby-on-railsnode.jshttpget

Node.js - Array is converted to object when sent in HTTP GET request query


The following Node.js code:

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

sends the following http GET request query that is received by like this:

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

How can I optimize this request to be received like this:

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

Note. The REST API is built in Ruby on Rails


Solution

  • I finally found a fix. I used 'qs' to stringify 'options' with {arrayFormat : 'brackets'} and then concatinated to url ended with '?' as follows:

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

    Note: I tried to avoid concatenation to url, but all responses had code 400