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

6

我在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 的功能?!

有什么想法吗?

2个回答

5
Uri.http构造函数的queryParameters参数期望一个未编码的数据映射,它使用自己的标准进行编码。但由于你需要在这种情况下使用另一种标准,因此最好使用Uri构造函数并构建自己的查询字符串,并将其传递给query参数。

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

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

是的,是的,是的!非常感谢您的快速支持 - 它起作用了。我花了2个小时进行了短暂的深入探索dart核心代码的调试,才发现在“queryParameters”中强制编码,这绕过了问题,太棒了! - Bridystone

0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接