Как добавить параметры запроса в HTTP-запрос Dart?

Как вы правильно добавляете параметры запроса к запросу Dart http get? Я не смог получить свой запрос, чтобы правильно ответить, пытаясь добавить '? Param1 = one & param2 = two' к моему URL-адресу, но он корректно работает в Postman. Вот суть моего кода:

    final String url = "https://www.myurl.com/api/v1/test/";
    String workingStringInPostman = "https://www.myurl.com/api/v1/test/123/?param1=one&param2=two";

    Map<String, String> qParams = {
     'param1': 'one',
     'param2': 'two',
    };


   var res = await http
      .get(Uri.encodeFull("$url${widget.pk}/"),
      headers: {HttpHeaders.authorizationHeader: "Token $token", 
        HttpHeaders.contentTypeHeader: "application/json"},
);

$ {Widget.pk} является просто целочисленным значением, являющимся pass (см. Значение 123 в переменной workStringInPostman.

QParams существует для попустительности, если требуется параметр Uri.

Пример кода будет приветствоваться.

Ответы

Ответ 1

Вы захотите построить Uri и использовать его для запроса. Что-то вроде

var queryParameters = {
  'param1': 'one',
  'param2': 'two',
};
var uri =
    Uri.https('www.myurl.com', '/api/v1/test/${widget.pk}', queryParameters);
var response = await http.get(uri, headers: {
  HttpHeaders.authorizationHeader: 'Token $token',
  HttpHeaders.contentTypeHeader: 'application/json',
});

См. Https://api.dartlang.org/stable/2.0.0/dart-core/Uri/Uri.https.html.

Ответ 2

Существует пакет dart, который предоставляет некоторые вспомогательные классы для http-запросов.

BasicUtils: https://github.com/Ephenodrom/Dart-Basic-Utils

Установите его с помощью:

dependencies:
  basic_utils: ^1.4.0

использование

Вы можете добавить карту заголовков и параметров запроса к каждому запросу. Смотрите пример:

// Define some headers and query parameters
Map<String, String> headers = {
  "Accept": "application/json"
};
Map<String, String> queryParameters = {
  "foo": "bar"
};

// Body
String body = "{ 'some':'json'}";

// Send request
Map<String, dynamic> responseData = await HttpUtils.postForJson("api.com/dosomething", body,
      headers: headers, queryParameters: queryParameters);

Дополнительная информация:

Это все методы из класса HttpUtils.

Future<Map<Response> getForFullResponse(String url,{Map<String, dynamic> queryParameters,Map<String, String> headers});
Future<Map<String, dynamic>> getForJson(String url,{Map<String, dynamic> queryParameters,Map<String, String> headers});
Future<String> getForString(String url,{Map<String, dynamic> queryParameters,Map<String, String> headers});
Future<Map<Response> postForFullResponse(String url, String body,{Map<String, String> queryParameters,Map<String, String> headers});
Future<Map<String, dynamic>> postForJson(String url, String body,{Map<String, String> queryParameters,Map<String, String> headers});
Future<String> postForString(String url, String body,{Map<String, String> queryParameters,Map<String, String> headers});
Future<Response> putForFullResponse(String url, String body,{Map<String, String> queryParameters,Map<String, String> headers});
Future<Map<String, dynamic>> putForJson(String url, String body,{Map<String, String> queryParameters,Map<String, String> headers});
Future<String> putForString(String url, String body,{Map<String, String> queryParameters,Map<String, String> headers});
Future<Response deleteForFullResponse(String url,{Map<String, String> queryParameters,Map<String, String> headers});
Future<Map<String, dynamic>> deleteForJson(String url,{Map<String, String> queryParameters,Map<String, String> headers});
Future<String> deleteForString(String url,{Map<String, String> queryParameters,Map<String, String> headers});
Map<String, dynamic> getQueryParameterFromUrl(String url);
String addQueryParameterToUrl(String url, Map<String, dynamic> queryParameters);

Ответ 3

Принятый ответ не работает для меня, но добавляет '& amp;' без кавычек до конца URL решает мою проблему. В этом случае измените следующую строку:

String workingStringInPostman = "https://www.myurl.com/api/v1/test/123/?param1=one&param2=two";

на это: (обратите внимание на '& amp;' в конце).

String workingStringInPostman = "https://www.myurl.com/api/v1/test/123/?param1=one&param2=two&";