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

后端 未结 3 1848
情书的邮戳
情书的邮戳 2021-01-27 21:10

The following Node.js code:

var request = require(\'request\');

var getLibs = function() {
    var options = { packages: [\'example1\', \'example2\', \'example3         


        
相关标签:
3条回答
  • 2021-01-27 21:34

    If the array need to be received as it is, you can set useQuerystring as true:

    UPDATE: list key in the following code example has been changed to 'list[]', so that OP's ruby backend can successfully parse the array.

    Here is example code:

    const request = require('request');
    
    let data = {
      'name': 'John',
      'list[]': ['XXX', 'YYY', 'ZZZ']
    };
    
    request({
      url: 'https://requestb.in/1fg1v0i1',
      qs: data,
      useQuerystring: true
    }, function(err, res, body) {
      // ...
    });
    

    In this way, when the HTTP GET request is sent, the query parameters would be:

    ?name=John&list[]=XXX&list[]=YYY&list[]=ZZZ
    

    and the list field would be parsed as ['XXX', 'YYY', 'ZZZ']


    Without useQuerystring (default value as false), the query parameters would be:

    ?name=John&list[][0]=XXX&list[][1]=YYY&list[][2]=ZZZ
    
    0 讨论(0)
  • 2021-01-27 21:45

    This problem can be solved using Request library itself. Request internally uses qs.stringify. You can pass q option to request which it will use to parse array params.

    You don't need to append to url which leaves reader in question why that would have been done.

    Reference: 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
    };
    
    0 讨论(0)
  • 2021-01-27 21:58

    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

    0 讨论(0)
提交回复
热议问题