Sttp Uri避免解码



我正在尝试从预签名的s3 url下载文件:

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.zipactivity-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让它更容易读:

<代码>

相关内容

  • 没有找到相关文章

最新更新