You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:13:55