我正在开发一项网络服务,使用AWS Lambda / API网关/ NodeJS更新Apple Wallet通行证。 Apple钱包点击api获取更新通行证,但每次我收到以下错误:
遇到错误:收到无效的传递数据(无法读取传递,因为它无效。)
我在浏览器中尝试了相同的URL来获取通行证。通行证每次下载,每次打开一个有效的通行证。但是,当Apple钱包打到URL时,它无法正常工作。我在Postman中尝试了相同的URL,它给了我base64而不是二进制数据。
我尝试使用NodeJS实现相同的功能并部署在heroku上,它与Wallet一起正常工作(也在Postman中提供二进制文件)。但我需要使用AWS Lambda / API网关/ NodeJS。
我不确定,如果AWS在提供二进制数据时改变某些内容。
对此有任何帮助表示赞赏。
答案 0 :(得分:3)
我刚刚经历过这种情况,花了好几个小时试图诊断发生了什么。
对于使用AWS API Gateway& Lambda用于他们的PassKit Web服务端点,有一个主要的"陷阱" (至少截至我的回复日期)API网关的逻辑如何确定是否需要转换来自base64 ==>的响应。二进制的。
如果您检查来自Apple Wallet / PassKit的请求标头,您会发现if (ferror(ffitness_data) || fflush(ffitness_data) || fclose(ffitness_data)) {
perror("write error on fitness_data.txt");
exit(1);
}
标头为Accept
。
API Gateway显然会遍历请求*/*
标题中的项目,并确定是否与您在下定义的任何二进制媒体类型匹配您的API名称>设置。它将使用它找到的第一个匹配,然后,正如您所希望的那样,将base64字符串(从Lambda)转换为二进制。
这是一个疯狂的部分 - 如果您将Accept
定义为"请转换为二进制"媒体类型,来自Apple Wallet / PassKit 的请求将无效 。为什么?好吧,AWS(无论出于何种原因......)没有编程application/vnd.apple.pkpass
来匹配 任何 类型...它只会 匹配*/*
。
因此,*/*
标题Accept
将不与*/*
和您的base64编码的.pkpass响应(来自Lambda) )不会被转换为二进制,导致PassKit阻塞+报告错误。
TL; DR - AWS API Gateway存在一些愚蠢行为。要成功返回PassKit传递数据,您需要在您的API名称>下添加application/vnd.apple.pkpass
(不 */*
)。设置>二元媒体类型。