亚马逊AWS WebSocket API - 发送消息时被禁止

5

我正在尝试为我的项目实现websocket api,所以我查看了这个教程:https://aws.amazon.com/blogs/compute/announcing-websocket-apis-in-amazon-api-gateway/

我尝试部署他们提供的简单聊天应用程序https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:729047367331:applications~simple-websockets-chat-app

我能够成功连接,使用wscat -c wss://url,但是当我尝试发送消息时,我会收到以下错误(其中有实际的id,我只是不确定它们从哪里生成,所以我把它们隐藏了)。

{"message": "Forbidden", "connectionId":"sample_id", "requestId":"sample_id"}

我不太确定问题出在哪里,因为这应该是一个已完成的版本(我已经成功部署并连接了它?),我希望能得到一些帮助。


你找到解决方案了吗?我也卡在同样的问题上了。 - guijob
很遗憾,我没有,如果你获取到了,请告诉我。 - user10901512
同样的情况,我现在正在使用第三方websocket服务器作为解决方法。 - guijob
2
此外,这个问题已经在这里进行了讨论。 - guijob
如果您使用Lambda集成手动配置了API的断开连接、连接和默认设置,那么您需要重新部署API才能生效。否则将不会产生任何影响。 - Khan
6个回答

5
在创建任何工作路由之前,您必须已经在API Gateway上配置了$default路由。

3

这对我起作用,需要将对象转换为字符串并传递动作和数据

var test = { action: "sendmessage", data: "hello world" };

ws.on("open", function open() {
  ws.send(JSON.stringify(test));
});

是的,这是一个解决方案,前提是sendmessage是RouteKey的名称。您可以通过检查API Gateway > Routes来确定它。注意不要拼错为sendMessage - Fabien Haddadi
我正在使用Amazon Connect,那么我需要创建路由吗?我将其发送到套接字-> {"topic":"aws/subscribe","content":{"topics":["aws/chat"]}},这样代理门户就会收到有关新聊天的通知。现在我该如何向代理发送消息? - Sunil Garg

2

在与此问题抗争了几个小时后,您可以采取以下几种方法:

  1. (推荐)在您的websocket api中创建一个自定义路由,这将是您通过websocket连接发送消息的地方。然后添加一个lambda集成(或您选择的其他后端集成)。在发送命令时,您将路由名称作为JSON序列化对象中的“action”发送。
ws.send(JSON.stringify({ action: [customRoute], message: "hello" })

注意:您可以发送任意数量的JSON字段,只需确保包含“action”!
第2步:将lambda集成(或其他集成)添加到apigateway中的$default路由。 所有不是“连接”或“断开连接”的操作都会转到该路由,由于您没有后端集成来处理该路由,因此AWS会友好地告诉您“Forbidden”,就像在apigateway REST api中缺少路由一样。
在这两种情况下,在进行更改后,您需要部署API(在“操作”选项卡下)以使这些更改生效。 所有这些挫折都可以通过更好的AWS文档解决...

2

连接成功后,请尝试:

{"message" : "sendMessage", "data" :" hi"}

我正在使用Amazon-Connect,那么我需要创建路由吗?我将其发送到套接字 ->{"topic":"aws/subscribe","content":{"topics":["aws/chat"]}}.. 通过这个代理门户会收到有关新聊天的通知..现在我该如何向代理发送消息? - Sunil Garg

0

这就是我正在做的,但仍然得到相同的结果

{"message": "禁止访问", "connectionId":"示例ID", "requestId":"示例ID"}

var test = { action: "sendmessage", data: "hello world" };
        connection.onopen = () => {
            connection.send(JSON.stringify(test));
            console.log("connection open?????");
        };
        connection.onerror = error => {
            console.log(`WebSocket error: ${error}`);
        };
        connection.onmessage = e => {
            console.log("On message come here?????")
            console.log("EEEE", JSON.stringify(e));
            console.log(e.data);
        };

-2

多亏了@prachiSingh提供的解决方案,我成功地通过微调发送了一条样本消息.... {"message":"sendmessage","data":"hello"}。基本上使用全部小写字母来表示sendmessage。


1
请决定这是一个“感谢”(在这种情况下,请删除帖子,因为它不是答案)还是一个答案(在这种情况下,删除“感谢”,并使有帮助的回答部分更明显)。 - Yunnosch
请不要在回答中添加“谢谢”。它们实际上并没有回答问题,而且可能会被未来的访问者视为噪音。一旦您获得足够的声望,您将获得特权,可以投票支持您喜欢的答案。这样,问题的未来访问者将看到该答案的更高投票数,并且回答者也将获得声望积分的奖励。请参见为什么投票很重要 - Yunnosch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接