Search code examples
httpflutterdart

Dart - sending GET parameters that are lists


I want to send parameters with an http GET request in dart. The first answer here demonstrates it well: How do you add query parameters to a Dart http request?

var uri =
    Uri.https('www.myurl.com', '/api/query', queryParameters);

However, a major problem is that queryParameters only accepts:

Map<String, String>

This doesn't allow me to pass in lists/arrays.

If i change my get request to a post request, I am easily able to send a body (as a json encoded String) as outlined by the flutter docs: https://pub.dev/documentation/http/latest/http/post.html

post(url, {Map<String, String> headers, body, Encoding encoding})

However, the get request has no such equivalent argument for query parameters: https://pub.dev/documentation/http/latest/http/get.html

get(url, {Map<String, String> headers})

I have also tried adding query parameters directly to the url like so:

get('www.myurl.com/api/query/?array[]=value1&array[]=value2&array[]=value3)

but the square brackets [] always get transformed into %5B%5D when I receive it in the server.

Any help is appreciated. Thanks


Solution

  • In fact, queryParameter takes Map<String, dynamic>. Check the source code:

      factory Uri(
          {String scheme,
          String userInfo,
          String host,
          int port,
          String path,
          Iterable<String> pathSegments,
          String query,
          Map<String, dynamic /*String|Iterable<String>*/ > queryParameters,
          String fragment}) = _Uri;
    

    The dynamic can be either a String or an Iterable<String>. So,

      var uri = Uri(
        scheme: 'http',
        host: 'www.myurl.com',
        path: '/api/query/',
        queryParameters: {
          'array': ['value1', 'value2', 'value3'],
        },
      );
      print(uri);
    

    prints:

    http://www.myurl.com/api/query/?array=value1&array=value2&array=value3