首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sttp Uri避免解码

Sttp Uri避免解码
EN

Stack Overflow用户
提问于 2021-02-01 11:05:42
回答 1查看 49关注 0票数 0

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

代码语言:javascript
复制
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时

代码语言:javascript
复制
val uri: Uri = uri"$url"

它对%3A进行解码。activity-2021-02-01_00%3A34%3A43.zip -> activity-2021-02-01_00:34:43.zip

代码语言:javascript
复制
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版本。

代码语言:javascript
复制
"com.softwaremill.sttp"       %% "core"                                 % "1.5.11",
"com.softwaremill.sttp"       %% "async-http-client-backend-future"     % "1.5.11"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-01 15:24:26

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

代码语言:javascript
复制
parsed.copy(
  pathSegments = Uri.AbsolutePath(parsed.pathSegments.segments
    .map(s => s.copy(encoding = QuerySegmentEncoding.All)).toList
  )
)

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

您也可以尝试使用快速镜头使其更具可读性:

代码语言:javascript
复制
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65986667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档