如何将查询参数添加到Dart http请求?

Pet*_*all 15 get http url-parameters dart flutter

如何正确地将查询参数添加到Dart http get请求?当我试图将'?param1 = one¶m2 = 2'附加到我的网址时,我无法正确回应我的请求,但它在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"},
);
Run Code Online (Sandbox Code Playgroud)

$ {widget.pk}只是一个传递的整数值(请参阅workingStringInPostman变量中的值123.

如果需要Uri参数,qParams可以用于connivence.

一个代码示例将受到欢迎.

小智 50

这更简单

final uri = Uri.parse('$baseUrl/v1/endpoint').replace(queryParameters: {
      'page': page,
      'itemsPerPage': itemsPerPage,
    });
final response = await client.get(uri);
Run Code Online (Sandbox Code Playgroud)


Nat*_*sch 33

您将要构造一个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',
});
Run Code Online (Sandbox Code Playgroud)

请参阅https://api.dartlang.org/stable/2.0.0/dart-core/Uri/Uri.https.html

  • 这里的 widget.pk 是什么 (12认同)
  • 由于某种原因,应用程序在“Uri.https”之后像异常一样停止,但没有错误,它只是停止。 (3认同)
  • 主机和路径的拆分就是答案。 (2认同)
  • 如果 url 是端口为“localhost:5001”的本地主机,则会出现错误。 (2认同)

Nan*_*amy 26

如果您不想覆盖基本端点 url 的方案,请使用以下技术将映射转换为查询字符串并将其附加到基本端点 url

var endpointUrl = 'https://www.myurl.com/api/v1/user';
Map<String, String> queryParams = {
  'param1': '1',
  'param2': '2'
};

var headers = {
  HttpHeaders.authorizationHeader: 'Token $token',
  HttpHeaders.contentTypeHeader: 'application/json',
}

String queryString = Uri(queryParameters: queryParams).query;

var requestUrl = endpointUrl + '?' + queryString; // result - https://www.myurl.com/api/v1/user?param1=1&param2=2
var response = await http.get(requestUrl, headers: headers);
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这不再起作用了。`http.get(requestUrl....)` 抛出错误 `参数类型 'String' 无法分配给参数类型 'Uri'。` (4认同)
  • @OjonugwaJudeOchalifu 只是将字符串包装在 Uri.parse() 中。 (3认同)

Tua*_*ong 8

有同样的问题。如果我的网址是 localhost 且端口类似于 ,则接受的答案将不起作用https://localhost:5001。经过 1 天的寻找解决方案后,我想出了Dio 库。以下是我使用的解决方案Dio

var _dio = new Dio();
var options = new Options;
options.headers['Authorization'] = 'bearer $token';
options.contentType = 'application/json';
String url = "https://www.myurl.com";
Map<String, String> qParams = {
  'param1': 'one',
  'param2': 'two',
};

var res = await _dio.get(url, options: options, queryParameters: qParams);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。


Cop*_*oad 6

使用Uri构造函数来构建查询,它有一个queryParameter属性。

var uri = Uri(
  scheme: 'https',
  host: 'example.com',
  path: '/foo/bar',
  fragment: 'baz',
  queryParameters: _yourQueryParameters,
);

var response = await http.get(uri);
if (response.statusCode == 200) {
  var json = jsonDecode(response.body);
  // Do whatever you want to do with json. 
}
Run Code Online (Sandbox Code Playgroud)


dee*_*raj 6

用于Uri传递查询参数,例如。

final String url = "https://www.myurl.com/api/v1/test/${widget.pk}/";

Map<String, String> qParams = {
 'param1': 'one',
 'param2': 'two',
};
Map<String, String> header = {
HttpHeaders.authorizationHeader: "Token $token", 
    HttpHeaders.contentTypeHeader: "application/json"
};

Uri uri = Uri.parse(url);
final finalUri = uri.replace(queryParameters: qParams); //USE THIS

final response = await http.get(
  finalUri,
  headers: header,
);
Run Code Online (Sandbox Code Playgroud)