微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Sttp Uri 避免解码

如何解决Sttp Uri 避免解码

我正在尝试从预先签名的 s3 网址下载文件

val url: String = "https://s3-us-west-2.amazonaws.com/exports.mandrillapp.com/<id>/activity-2021-02-01_00%3A34%3A43.zip?AWSAccessKeyId=<access_key>&Expires=1612744535&Signature=<signature>"

当我将其转换为 Uri 时

val uri: Uri = uri"$url"

它解码 %3Aactivity-2021-02-01_00%3A34%3A43.zip -> activity-2021-02-01_00:34:43.zip

https://s3-us-west-2.amazonaws.com/exports.mandrillapp.com/<id>/activity-2021-02-01_00:34:43.zip?AWSAccessKeyId=<access_key>&Expires=1612744535&Signature=<signature>

当我尝试使用解码后的 Uri 获取文件时,我收到此错误消息:

The request signature we calculated does not match the signature you provided. Check your key and signing method.

我认为 uri 解码会导致问题,因为 %3A 上的 curl 有效,但 : 无效。

有没有办法避免解码路径?我找不到任何关于它的信息。

我正在使用以下 sttp 版本。

"com.softwaremill.sttp"       %% "core"                                 % "1.5.11","com.softwaremill.sttp"       %% "async-http-client-backend-future"     % "1.5.11"

解决方法

您需要将解析后的 URI 中路径段的编码更改为更严格的编码:

parsed.copy(
  pathSegments = Uri.AbsolutePath(parsed.pathSegments.segments
    .map(s => s.copy(encoding = QuerySegmentEncoding.All)).toList
  )
)

这是使用 sttp3,因此可能需要为 sttp1 稍作编辑。我们在这里使用查询编码,根据 rfc3986 在查询中转义 :,但不在路径中(它是合法字符)。

您也可以尝试使用 quicklens 使其更具可读性:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。