ejabberd本地调用REST API创建MUC房间失败,返回200却无房间
问题分析与解决办法
你遇到的核心问题是误用了ejabberd的模块:你配置的mod_rest并不是用来处理REST风格API请求的模块,它的作用是通过HTTP接收XMPP Stanza(XML格式的XMPP消息),所以你发送JSON格式的create_room请求时,它返回Try POSTing a stanza.是预期行为——因为它在等待XMPP XML数据,而非JSON。
要实现通过REST API创建MUC房间,你需要使用mod_http_api模块,以下是完整的修正步骤:
1. 修正ejabberd配置文件(ejabberd.yml)
步骤1.1:替换HTTP请求处理器
将你原来的listen段配置,把mod_rest替换为mod_http_api:
listen: - port: 5285 module: ejabberd_http request_handlers: "/api": mod_http_api # 用mod_http_api处理/api路径的请求
步骤1.2:启用mod_http_api并配置权限
在modules段添加mod_http_api的配置,允许本地IP调用,并授予创建房间的权限:
modules: # 确保你已经启用了MUC模块(如果之前没配置的话) mod_muc: host: "mychatservice.host.com" # 必须和你curl请求中的service参数一致 access: allow access_admin: allow # 配置HTTP API模块 mod_http_api: allowed_ips: - "127.0.0.1" access_commands: # 授予admin角色的用户调用create_room的权限 create_room: - allow: admin
步骤1.3:确保管理员账号存在
你需要有一个具备admin权限的ejabberd账号,比如admin@host.com,如果没有可以用以下命令创建:
ejabberdctl register admin host.com your_admin_password
2. 重启ejabberd服务
修改配置后必须重启ejabberd才能生效:
ejabberdctl restart
3. 修正curl调用命令
现在使用正确的API端点和认证方式(ejabberd的REST API默认需要Basic Auth):
curl -X POST -u "admin@host.com:your_admin_password" -H "Content-Type: application/json" http://localhost:5285/api/create_room -d '{ "name": "testroom", "service": "mychatservice.host.com", "host": "host.com" }'
4. 验证房间是否创建成功
执行以下命令查询在线MUC房间:
ejabberdctl muc_online_rooms mychatservice.host.com
(注意:这里要指定MUC服务的域名,而不是global,因为你的MUC服务是mychatservice.host.com)
额外说明
- 如果你不需要认证(仅测试环境),可以在
mod_http_api的access_commands中设置allow: all,但生产环境强烈不建议这么做。 - 你之前用
ejabberdctl muc_online_rooms global没查到结果,一是因为房间没创建成功,二是global参数通常用于查询所有服务的房间,但如果你的MUC服务配置正确,指定服务域名会更准确。
内容的提问来源于stack exchange,提问作者Jeffrey
相关产品推荐
相关产品推荐

