4

如何在Dart中安全地解析查询字符串?

假设我的q字符串值为:

?page=main&action=front&sid=h985jg9034gj498g859gh495

理想情况下,代码应该在服务器和客户端都可以工作,但现在我将满足于工作的客户端代码。

4

3 回答 3

17

越简单越好。查找类 Uri的splitQueryString静态方法。

Map<String, String> splitQueryString(String query, {Encoding encoding: UTF8}) 

Returns the query split into a map according to the rules specified for 
FORM post in the HTML 4.01 specification section 17.13.4. Each key and value 
in the returned map has been decoded. If the query is the empty string an 
empty map is returned.
于 2013-12-02T19:03:13.367 回答
7

我为此目的制作了一个简单的包:https ://github.com/kaisellgren/QueryString

例子:

import 'package:query_string/query_string.dart');

void main() {
  var q = '?page=main&action=front&sid=h985jg9034gj498g859gh495&enc=+Hello%20&empty';

  var r = QueryString.parse(q);

  print(r['page']); // "main"
  print(r['asdasd']); // null
}

结果是一个Map. 访问参数只是一个简单的r['action'],访问一个不存在的查询参数是null

现在,要安装,添加到您pubspec.yaml的依赖项:

dependencies:
  query_string: any

并运行pub install

该库还处理诸如%20和之类的解码,+甚至对空参数也有效。

它不支持“数组样式参数”,因为它们不是RFC 3986规范的一部分。

于 2012-10-28T12:18:54.013 回答
0

我这样做是这样的:

 Map<String, String> splitQueryString(String query) {
    return query.split("&").fold({}, (map, element) {
      int index = element.indexOf("=");
      if (index == -1) {
        if (element != "") {
          map[element] = "";
        }
      } else if (index != 0) {
        var key = element.substring(0, index);
        var value = element.substring(index + 1);
        map[key] = value;
      }
      return map;
    });
 }

我从 splitQueryString

于 2021-05-22T13:51:52.353 回答