如何在 Dart 中对 URL 进行编码?

How to encode URLs in Dart?

我正在尝试将一些代码从 Python 移植到 Dart(用于 Flutter 应用程序)。但是,我在编码 URL 时遇到了一些麻烦。我正在尝试做相当于 parsedData = urllib.parse.quote(STR_DATA) 的事情。我得到的最接近的是 Uri Dart class,其中:

parsedData = Uri(queryParameters: STR_DATA);
parsedData = Uri.encodeComponent(parsedData.toString());

这接近我想要得到的但不完全是。我使用 Python 得到的结果是这样的(旁注:它只是在句号之后编码):

ig_sig_key_version=4&signed_body=efbcf4ac8577da5eb43f33f369cda4248dba52a407e88a565038b53933737bba.%7B%22phone_id%22%3A%20%22ee79227a-cf89-41c8-9598-d0c6f3931fa4%22%2C%20%22_csrftoken%22%3A%20%22BB1PRXVV1y6FgU0Rfmcda3jJG5eVFSPd%22%2C%20%22username%22%3A%20%22USERNAME%22%2C%20%22guid%22%3A%20%22c668814c-a1e9-487c-97f0-8491b2c07c1c%22%2C%20%22device_id%22%3A%20%22android-7eb57ab90e1e2c3e%22%2C%20%22password%22%3A%20%22PASSWORD%22%2C%20%22login_attempt_count%22%3A%20%220%22%7D

在使用 Dart 时,我得到这样的结果:

ig_sig_key_version=4&signed_body=d1c26c132b536b3f4ffdd7f5c0524503e48216fb7f638b5f4cab65d74a9834de.%3Fphone_id%3D112626ab-1946-4ad0-bc63-b233f57033f9%26_csrftoken%3DhiPh0jSvjd0eP2dP4VUr83t3htYF7xci%26username%3DUSERNAME%26guid%3D999d2242-f52a-4044-96d9-2245c6757fbc%26device_id%3Dandroid-5daff5c3029f414c%26password%3DPASSWORD%26login_attempt_count%3D0

顺便说一下,我之所以需要这个以相同的方式编码是因为否则我的 HTTP 请求 returns 400。无论如何,我们将不胜感激;提前谢谢你。

其他附注:我认为这是导致我的请求被拒绝的原因,但我不知道,我没有做过很多网络工作。如果您认为这可能是其他问题,请随时纠正我。

使用 Dart Uri Class

var uri = 'http://example.com/path/to/page?name=ferret john';
var encoded = Uri.encodeFull(uri);
assert(encoded == 'http://example.com/path/to/page?name=ferret%20john');

var decoded = Uri.decodeFull(encoded);
assert(uri == decoded);

你做的太多了。 在这种情况下,您需要执行:parsedData = Uri.encodeComponent(STR_DATA);以获得与Python代码相同的结果。