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

IAm*_*aja 11 url map type-conversion query-string dart

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

Map json = {
    "email":  eml,
    "password": passwd
};
Run Code Online (Sandbox Code Playgroud)

一个基本网址:

String baseURL = "http://localhost:8080/myapp";
Run Code Online (Sandbox Code Playgroud)

然后我需要一些东西将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);
Run Code Online (Sandbox Code Playgroud)

我在Git上找到了这个查询String-to-map库,但我需要反过来!在那里获取URL编码也很棒.

我很高兴自己做一些本土的东西,但对Dart这么新,我想知道是否有任何关于pub/ Github/etherspehere已经做到了这一点.

use*_*314 17

你看过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: ""}) #
Run Code Online (Sandbox Code Playgroud)

请注意,您将查询字符串作为映射传递,如果您使用的是不接受此类的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);

    }
Run Code Online (Sandbox Code Playgroud)

这打印:

http://localhost:8080/myapp?email=me%40here.com&password=password
Run Code Online (Sandbox Code Playgroud)

请注意,一旦构造了Uri是不可变的,即您无法再次更改查询参数.虽然我还没有使用它,但在酒吧里也有这个包可以提供更多的设施.

  • 为什么这不是公认的答案?你也可以使用带有 `queryParameters` 参数的 `Uri` 构造函数将 `Map` 转换为查询字符串,非常方便。 (2认同)

Ale*_*kov 14

TL; 博士

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

print(queryString); // x=1&y=2
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是,`queryParameters` 只能是 `Map&lt;String, String&gt;` 或 `Map&lt;String, Iterable&lt;String&gt;&gt;`。不幸的是,它不够智能,无法自动获取“Map&lt;String,dynamic&gt;”类型的“.toString()”值。https://api.dart.dev/stable/2.0.0/dart-core/Uri/Uri.html 以下逻辑转换我的动态地图以供我使用: `Uri(queryParameters: json.map((key, value)) =&gt; MapEntry(key, value == null ? null : value.toString()))).query` (2认同)

小智 7

final yourMap = {'x': '1', 'y': '2'};
final queryString = yourMap.toMap().entries.map((e) => '${e.key}=${e.value}').join('&');
print(queryString); // x=1&y=2
Run Code Online (Sandbox Code Playgroud)


Mat*_*t B 0

你能描述一下你的用法吗?首先,在 GET 请求中保留密码等数据并不是一个好的做法。如果是 POST 请求,效果会更好。也就是说,如果您确实想使用它作为 POST 请求将地图发送到服务器,请查看:HttpRequest.postFormData它会自动将您提供的地图作为 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);
  }
});
Run Code Online (Sandbox Code Playgroud)

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

在这一点上,如果您确实决定推出自己的产品,也许可以向您在问题中提到的 QueryString 项目提供拉取请求,以便其他人可以在一个简单的包中使用该功能。