使用aws api网关

时间:2017-08-31 13:03:11

标签: node.js aws-api-gateway wallet

我正在开发一项网络服务,使用AWS Lambda / API网关/ NodeJS更新Apple Wallet通行证。 Apple钱包点击api获取更新通行证,但每次我收到以下错误:

遇到错误:收到无效的传递数据(无法读取传递,因为它无效。)

我在浏览器中尝试了相同的URL来获取通行证。通行证每次下载,每次打开一个有效的通行证。但是,当Apple钱包打到URL时,它无法正常工作。我在Postman中尝试了相同的URL,它给了我base64而不是二进制数据。

我尝试使用NodeJS实现相同的功能并部署在heroku上,它与Wallet一起正常工作(也在Postman中提供二进制文件)。但我需要使用AWS Lambda / API网关/ NodeJS。

我不确定,如果AWS在提供二进制数据时改变某些内容。

对此有任何帮助表示赞赏。

1 个答案:

答案 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 */*)。设置>二元媒体类型