Dart:将地图转换为查询字符串

时间:2013-12-27 17:17:17

标签: url map type-conversion query-string dart

我有一种情况需要将Map变成查询字符串(在第一个?之后)。例如,如果我有以下地图:

Map json = {
    "email":  eml,
    "password": passwd
};

基础网址:

String baseURL = "http://localhost:8080/myapp";

然后我需要将json Map转换为基本URL的查询字符串的东西:

String fullURL = parameterizeURL(baseURL, json);

// Prints: http://localhost:8080/myapp?email=blah&password=meh
// (if "blah" was entered as the email, and "meh" was entered as the password)
print(fullURL);

我在Git上找到this query String-to-map library,但我需要反向!在那里获取URL编码也很棒。

我很高兴能够制作本土的东西,但对Dart这么新,我想知道pub / Github / etherspehere上是否有任何东西可以做到这一点。

5 个答案:

答案 0 :(得分:14)

你看过dart中的Uri课:核心。您可以从Url组件构建Uri类:

new Uri({String scheme, String userInfo: "", String host: "", port: 0, String path, 
  Iterable<String> pathSegments, String query, 
  Map<String, String> queryParameters, fragment: ""}) #

请注意,您将查询字符串作为映射传递,如果您使用的是不接受此类的HTTP客户端,则可以将其绑定以获取Url。

我在我的代码中使用它而不是字符串Url的

使用上述数据作为示例:

void main() {

      String eml = "me@here.com";
      String passwd = "password";

      Map json = {
                  "email":  eml,
                  "password": passwd
      };  


      Uri outgoingUri = new Uri(scheme: 'http',
          host: 'localhost',
          port: 8080,
          path: 'myapp',
          queryParameters:json);

      print(outgoingUri);

    }

打印:

http://localhost:8080/myapp?email=me%40here.com&password=password

注意,一旦构造了Uri是不可变的,即你不能再次更改查询参数。在pub中还有this包可以提供更多设施,尽管我还没有使用它。

答案 1 :(得分:6)

TL; DR

String queryString = Uri(queryParameters: {'x': '1', 'y': '2'}).query;

print(queryString); // x=1&y=2

答案 2 :(得分:1)

你能描述一下你的用法吗?首先,在GET请求中保留密码等数据并不是一种好习惯。这可以更好地成为POST请求。也就是说,如果您确实希望将其用作POST请求以将服务器发送到地图,请查看:HttpRequest.postFormData它会自动将您提供的Map作为POST数据添加到服务器。需要记住的一点是,数据必须是Map(或键和值必须是字符串)。用法示例:

import 'dart:html';
// ...

// Somewhere in your login related method
HttpRequest.postFormData('login.php', data).then((HttpRequest req) {
  if(req.status != 200) {
    print(req.statusText);
  }
});

有一个可用于服务器端Dart的软件包,它允许您轻松地处理各种HTTP请求,简称为http。但是,这不适用于客户端脚本。我不知道任何现有的软件包可以提供您正在寻找的功能。

在这方面,如果您决定自己推送,可能会向您在问题中提到的QueryString项目提供拉取请求,以便其他人可以在一个简单的包中使用该功能。

答案 3 :(得分:0)

我写了一个递归函数来将任何Map<String, dynamic>转换为查询String

String getQueryString(Map params, {String prefix: '&', bool inRecursion: false}) {

    String query = '';

    params.forEach((key, value) {

        if (inRecursion) {
            key = '[$key]';
        }

        if (value is String || value is int || value is double || value is bool) {
            query += '$prefix$key=$value';
        } else if (value is List || value is Map) {
            if (value is List) value = value.asMap();
            value.forEach((k, v) {
                query += getQueryString({k: v}, prefix: '$prefix$key', inRecursion: true);
            });
        }
   });

   return query;
}

示例:

Map<String, dynamic> params = {'aa': 1.1, 'bb': [2, [3, ['5', {'66': 777}]]]};
String query = getQueryString(params);
print(query);

此代码将打印:

&aa=1.1&bb[0]=2&bb[1][0]=3&bb[1][1][0]=5&bb[1][1][1][66]=777

答案 4 :(得分:0)

以防万一,如果您使用 Dio 库,您可以使用 Transformer.urlEncodeMap。它接受 Map

String Transformer.urlEncodeMap(Map<String, dynamic>)

您可以在此处的官方文档中找到它:https://pub.dev/documentation/dio/latest/dio/Transformer/urlEncodeMap.html