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
简单得多,也不易出错。避免使用它们,并向任何指示您使用它们的人投诉。
我的 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
简单得多,也不易出错。避免使用它们,并向任何指示您使用它们的人投诉。