我在heroku上托管了一个简单的松弛斜杠命令,效果很好。我将其移至lambda,但现在得到了:
Darn - that slash command didn't work (error message: `400_client_error`). Manage the command at .
该错误未提供更多信息,也没有说明失败的原因。
我可以用curl击中端点,它返回给我的看起来像是正确格式化的json:
curl -X POST \
https://5hi90e8v8e.execute-api.us-east-2.amazonaws.com/Prod \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Postman-Token: eacb33ee-96ac-457e-a325-9fdc132f808e' \
-H 'cache-control: no-cache'
{
"text": "Have suggestions to improve this bot? Message <@UC8R7PA87>",
"response_type": "in_channel"
}
标题:
Date →Sat, 09 Mar 2019 01:12:02 GMT
Content-Type →application/json
Content-Length →922
Connection →keep-alive
x-amzn-RequestId →57cec19a-4208-11e9-924c-89367de80c6d
x-amz-apigw-id →WP_jLFWYiYcFiXg=
X-Amzn-Trace-Id →Root=1-5c8312e1-327ac177db85f799dcd267c1;Sampled=0
我的旧heroku端点的响应:
{
"response_type": "in_channel",
"text": "Have suggestions to improve this bot? Message <@UC8R7PA87>"
}
标题:
Connection →keep-alive
Server →gunicorn/19.6.0
Date →Sat, 09 Mar 2019 01:01:36 GMT
Content-Type →application/json
Content-Length →946
Via →1.1 vegur
关于如何查找实际错误/如何调试的任何想法?
答案 0 :(得分:2)
更新:简单的解决方案是使用 API网关Lambda代理集成,这将繁重的工作从API网关转移到Lambda函数:Understand API Gateway Lambda Proxy Integration
Lambda 总是期望以JSON
的形式从 API网关接收数据,并且在某些情况下,发送到API的数据可能不正确。不是JSON
。
来自 Slack 的斜杠命令就是这种情况。
它们以POST
的Content-Type发出application/x-www-form-urlencoded
请求,因此请求的内容类似于:
token=gIkuvaNzQIHg97ATvDxqgjtO&command=/weather&text=lorem
在集成请求的映射模板部分的 API网关中,您必须为广告的Content-Type添加模板要求我们期望。在这种情况下,它是application/x-www-form-urlencoded
。
您可以简单地按原样将请求正文包装在JSON
对象中,以便我们可以将值获取给Lambda进行解析。
{
"postBody" : $input.json("$")
}
此信息来自https://medium.com/@farski/learn-aws-api-gateway-with-the-slack-police-ca8d636e9fc0
答案 1 :(得分:1)
可能是AWS Gateway中的问题及其如何转换请求。尝试使用:
{
"method": "$context.httpMethod",
"body" : $input.json('$'),
"headers": {
#foreach($param in $input.params().header.keySet())
"$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end
#end
}
}
在集成请求/映射模板/ application / json中进行调试。