Dart/Flutter: URI/HTTPClient - 禁用 % 的自动转义

Dart/Flutter: URI/HTTPClient - disable automatic escaping of %

我的 dart/flutter URI 实现有问题。 % 自动替换为 %25。

我想访问以下内容URL: http://some.domain/json.php?key=%DF [%DF=ß 在 ASCII/latin1]

代码:

    final uri = Uri.http('some.domain', 'json.php', {'key': 'ß'});

结果 http://some.domain/json.php?key=%C3%9F [UTF-8 中的ß]

尝试时

    final uri = Uri.http('some.domain', 'json.php', {'key': '%DF'});

结果是: http://some.domain/json.php?key=%25DF[%自动转义为%25]

尝试显式编码时:

    final uri = Uri.http('some.domain', 'json.php',
        {'key': Uri.encodeQueryComponent('ß', encoding: latin1)});      

结果是: http://some.domain/json.php?key=%25DF[%自动转义为%25]

如何禁用 % 到 %25 的自动编码?!

有什么想法吗?

Uri.http 构造函数的 queryParameters 参数需要一个未编码的数据映射,它使用自己的标准进行编码,因为在这种情况下您需要使用另一个标准可能更好地使用Uri 构造函数并构建您自己的查询字符串并传递给 query 参数。

像这样应该可以解决问题:

final uri = Uri(
  scheme: 'http',
  host: 'some.domain',
  path: 'json.php',
  query: 'key=${Uri.encodeQueryComponent('ß', encoding: latin1)}'
);

如果您已经知道编码的 URL,只需使用 Uri.parse:

var uri = Uri.parse('http://some.domain/json.php?key=%DF');

Uri.parse 比尝试直接使用 Uri.http/Uri.https 简单得多,也不易出错。避免使用它们,并向任何指示您使用它们的人投诉。