postman 如何将S3延续令牌从API Gateway传递到Lambda

mrfwxfqh  于 12个月前  发布在  Postman
关注(0)|答案(1)|浏览(87)

我在AWS API Gateway中有一个REST API,它可以在S3上获取json文件,并通过Lambda函数将它们返回给API Gateway。我在Lambda中实现了分页,每次只获取100个文件,并返回S3 Continuation Token(如果存在)。
我已经在API Gateway上创建了一个查询参数,用于将后续调用的延续令牌发送到S3,但API Gateway不会传递它,因为它的格式。
有效的S3令牌:17kqE73kRqN1CZ8LJHWui7rlHD7+SHZgFRVQ5gVJAyF90msNxKgc6LiqRgMzGg5HfIJZP/Dc0Zenf8q7Az93KYtfkcRKtwQ6RL8P4cjGyjR0=
1.当在Postman中直接使用它时,我得到一个“InvalidQueryStringException”错误(http400)
1.通过直接在Lambda中进行测试,我发现删除最后一个'='字符会在S3中产生相同的文件,并且不会抛出400错误,但'+'字符在APIG中被替换为空格,这使得令牌无效。
1.我也试过在Postman中用""'' Package 令牌,但没有成功。
1.通过提供完整令牌的测试函数直接在APIG中调用该方法,可以按预期工作。
我将continuation标记从urlMap到Lambda,如下所示:"continuationToken": "$input.params('continuationToken')",
关于如何让令牌正确通过API网关,有什么建议吗?

zbdgwd5y

zbdgwd5y1#

当将token作为查询字符串传递时,您需要对它进行urlencode,否则=将被视为RFC 3986中指定的参数分隔符(子组件分隔符)。
正确编码的令牌将把转义的=呈现为%3D
如果Lambda是用JS编写的,你可以这样编码这个token:

const continuationToken = encodeURIComponent("17kqE73kRqN1CZ8LJHWui7rlHD7+SHZgFRVQ5gVJAyF90msNxKgc6LiqRgMzGg5HfIJZP/Dc0Zenf8q7Az93KYtfkcRKtwQ6RL8P4cjGyjR0=")
// continuationToken is now 17kqE73kRqN1CZ8LJHWui7rlHD7%2BSHZgFRVQ5gVJAyF90msNxKgc6LiqRgMzGg5HfIJZP%2FDc0Zenf8q7Az93KYtfkcRKtwQ6RL8P4cjGyjR0%3D

字符串

相关问题