通过AWS API网关到AWS Lambda的Slack slash命令(Python与Java)



我正在尝试将Slack slash-command连接到AWS Lambda(通过AWS API网关(。

我能够在Lambda教程部分修改Hello,World蓝图(用Python编写(。我设置了一个API网关作为触发器,然后让Slack将slash-command发送到API端点。我必须手动解码base64主体,然后使用parse_qs将查询字符串(如POST主体(转换为字典,然后在那里我可以很好地访问它。

我真正的Lambda代码目前是用Java编写的,但我从《开发者指南》中的Java基本示例应用程序开始。我构建了应用程序,上传了jar,并确认调用了正确的处理程序。我建立了另一个API网关,并在新的端币上指向了一个不同的Slack slash-command。它失败了。

日志看起来像:

java.lang.RuntimeException: An error occurred during JSON parsing
Caused by: java.io.UncheckedIOException: com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token
at [Source: (ByteArrayInputStream); line: 1, column: 1]

我猜这意味着Slack在POST正文中发送了相同的类似查询字符串的参数,并且出于某种原因,有些东西需要JSON输入,而不仅仅是文本。我不明白为什么Python处理程序可以构建一个事件字典并让Lambda解码POST主体,而Java处理程序从来没有被调用过,但在尝试反序列化POST主体时,它正在消亡,以为它是JSON。

Lambdas和API网关都是用通常的默认值AFAICT设置的。

我通过切换到使用HandlerStream示例来解决问题。然后我可以得到";身体;从事件中,Base64.decodeBase64 it,然后使用UriParameterMap.parse.解压缩表单参数

然后,我处理来自Slack slash命令的传入文本,然后返回Slack期望的JSON字符串。

最新更新