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

时间:2018-10-15 20:33:57

标签: http get dart flutter url-parameters

如何正确将查询参数添加到Dart http获取请求?尝试将'?param1 = one&param2 = two'附加到我的网址时,我无法获得正确响应的请求,但是在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}只是一个传递的整数值(请参阅workingStringInPostman变量中的值123。

如果需要Uri参数,则可以使用qParams。

欢迎使用代码示例。

8 个答案:

答案 0 :(得分:20)

您将要构造一个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

答案 1 :(得分:4)

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

var endpointUrl = 'https://www.myurl.com/api/v1/user';
Map<String, String> queryParams = {
  'param1': '1',
  'param2': '2'
};
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);

答案 2 :(得分:1)

使用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. 
}

答案 3 :(得分:0)

有一个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);

答案 4 :(得分:0)

接受的答案对我不起作用,但是在URL末尾添加无引号的'&'解决了我的问题。在这种情况下,请更改以下行:

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

对此:(请注意末尾的“&”)。

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

答案 5 :(得分:0)

回答了同样的问题。如果我的网址是端口为https://localhost:5001的本地主机,则可接受的答案将不起作用。花了1天时间寻找解决方案后,我提出了Dio library。以下是我使用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);

希望这会有所帮助。

答案 6 :(得分:0)

我做了一个小 util 函数来解析 docker run --rm ${Opts} alpine:3.12 创建的 Invoke-Expression -Command "docker run --rm ${Opts} alpine:3.12" / authority 参数。

unencodedPath

这是使用它的示例代码:

Uri

答案 7 :(得分:0)

使用 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,
);