【问题标题】:Dart/Flutter: URI/HTTPClient - disable automatic escaping of %Dart/Flutter: URI/HTTPClient - 禁用 % 的自动转义
【发布时间】:2021-08-04 17:00:47
【问题描述】:

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

我想访问以下网址: http://some.domain/json.php?key=%DF [%DF=ß in 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 的自动编码?!

有什么想法吗?

【问题讨论】:

    标签: flutter http dart uri


    【解决方案1】:

    如果您已经知道编码后的网址,只需使用Uri.parse

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

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

    【讨论】:

      【解决方案2】:

      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 中存在强制编码,这很好地规避了这个问题!
      猜你喜欢
      • 2019-05-17
      • 1970-01-01
      • 2020-06-08
      • 2012-11-19
      • 1970-01-01
      • 2018-09-11
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多