jQuery.param в Dart

#flutter #dart #urlencode

#трепетание #dart #urlencode

Вопрос:

Мне нужно отправить тело с типом содержимого: application / x-form-urlencoded

Основной запрос в json выглядит следующим образом

 {"skip":0,"take":50,"pageSize":50,"page":0,"filter":{"logic":"and","filters":[{"operator":"startsWith","field":"nazione","value":"it"}]}}
  

Мне нужно преобразовать его в:

 skip=0amp;take=50amp;page=1amp;pageSize=50amp;filter%5Blogic%5D=andamp;filter%5Bfilters%5D%5B0%5D%5Boperator%5D=startsWithamp;filter%5Bfilters%5D%5B0%5D%5Bfield%5D=nazioneamp;filter%5Bfilters%5D%5B0%5D%5Bvalue%5D=it
  

В jQuery я могу получить этот результат, просто передав json в $.param, существует ли что-нибудь подобное в dart?

Я использую http (из ‘package: http / http.dart’), и я не знаю, как преобразовать тело для использования в http.post:

 http.post(url, headers: Map<String, String>.from({'application/x-www-form-urlencoded; charset=UTF-8'}), body: ???)
  

тело построено таким образом:

 var filters = [
    Map<String, String>.from({
        'operator': 'startsWith', 
        'field': 'nazione', 
        'value': 'it'
    })
];

var filter = Map<String, dynamic>.from({
    'logic': 'and',
    'filters': filters
});

var body = Map<String, dynamic>.from({
    'skip': 0,
    'take': 50,
    'pageSize': 50,
    'page': 1,
    'filter': filter
});
  

Попытка

 Uri(
    scheme: 'https',
    host: 'myhost',
    port: 8443,
    queryParameters: body,
    pathSegments: ["api", "coutries", "grid"]);
  

Я получаю сообщение об ошибке

 type 'int' is not a subtype of type 'Iterable<dynamic>'
  

Потому что я должен преобразовать тело как:

 Map<String, String>.from({
      'take': 50.toString(),
      'skip': 0.toString(),
      'pageSize': 50.toString(),
      'page': 1.toString(),
      'filter[logic]': 'and',
      'filter[filters][0][operator]': 'startsWith',
      'filter[filters][0][field]': 'nazione',
      'filter[filters][0][value]': 'it'
})
  

В этом случае параметр запроса в Uri работает. Я новичок в Dart, поэтому, прежде чем пытаться решить эту проблему с нуля, я хотел бы знать, существует ли какой-нибудь простой и правильный способ сделать это.

Ответ №1:

Используйте параметры запроса класса Uri:

 Uri(scheme: 'http', host: 'example.com', queryParameters: {...})
  

Комментарии:

1. пожалуйста, взгляните на обновленный вопрос. «Проблема» заключается в преобразовании тела