如何在 Dart 中编码 URL?

Posted

技术标签:

【中文标题】如何在 Dart 中编码 URL?【英文标题】:How to encode URLs in Dart? 【发布时间】:2020-04-25 15:03:30 【问题描述】:

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

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 请求将返回 400。无论如何,感谢任何帮助;提前谢谢你。

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

【问题讨论】:

这可能有助于***.com/a/10247302/4712391 【参考方案1】:

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

【讨论】:

好的,所以,我认为编码可能不是我的问题。你知道为什么我的请求可能会被拒绝吗?更多信息:这是一个发布请求,标题是相同的,正文是那些(在每种语言中),这就是我认为是这样的原因,因为它是唯一不同的东西,但我会继续努力弄清楚.感谢您的回答和任何其他建议。 好的,更新,当我复制python生成的body时,请求通过了,所以肯定是这样的。【参考方案2】:

使用 Dart Uri 类

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);

【讨论】:

好的,所以,我认为编码可能不是我的问题。你知道为什么我的请求可能会被拒绝吗?更多信息:这是一个发布请求,标题是相同的,正文是那些(在每种语言中),这就是为什么我认为是这样,因为这是唯一不同的东西,但我会继续努力弄清楚.感谢您的回答和任何其他建议。 好的,更新,当我复制python生成的body时,请求通过了,所以肯定是这样的。 出现错误 - URI 中的百分比编码非法 @krishnadas Krishnadas - 请检查此主题并分享您的建议,非常感谢 - ***.com/questions/69345632/… 感谢兄弟分享此代码:)

以上是关于如何在 Dart 中编码 URL?的主要内容,如果未能解决你的问题,请参考以下文章

在 URL 参数中传递用户名和密码 (Dart & Flutter)

Dart:如何在调试和生产模式下使用不同的设置?

如何从 Dart 将 x、y 坐标编码为 python ecdsa VerifyingKey 格式

本文将向您展示如何在 Flutter 中编码/解码 JSON

如何在 Dart 中正确下载图片并转换为 base64?

Flutter如何跳转外部地图app导航