Skip to content

消息收发

发送消息(HTTP)

POST JWT

/api/message/send

通过 HTTP 接口发送消息。适用于 WebSocket 不可用的降级场景。消息会通过 WebSocket 实时推送给在线接收方,离线用户触发 Web Push 通知。

请求参数

字段类型必填说明
toIdstring接收方 ID(用户 ID 或群 ID)
chatTypestring聊天类型:"single""group"
contentstring消息内容,最长 10000 字符
contentTypestring内容类型,默认 "text",可选 "image"
replyTostring引用的消息 ID
imageUrlstring图片 URL(contentType 为 image 时必填)

请求示例

bash
curl -X POST http://localhost:3000/api/message/send \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <token>" \
  -d '{
    "toId": "u_def456",
    "chatType": "single",
    "content": "你好!"
  }'

成功响应

json
{
  "code": 200,
  "message": "消息发送成功",
  "data": {
    "id": "msg_xyz789",
    "timestamp": 1719000000000
  }
}

错误场景

条件响应
被对方屏蔽{ "code": 403, "msg": "对方已将你屏蔽" }
群聊中被禁言{ "code": 403, "msg": "你已被禁言" }
非群成员{ "code": 403, "msg": "你不是该群成员" }

注意

推荐使用 WebSocket 发送消息以获得更好的实时性。HTTP 接口主要用于兼容场景或服务端主动推送。


发送消息(WebSocket)

通过 WebSocket 发送 message 类型消息,是推荐的发送方式。

json
{
  "type": "message",
  "data": {
    "id": "msg_1719000000_a1b2c3",
    "fromId": "u_abc123",
    "toId": "u_def456",
    "chatType": "single",
    "content": "你好!",
    "contentType": "text",
    "replyTo": "",
    "imageUrl": ""
  }
}

发送后服务端会返回 ack 确认:

json
{
  "type": "ack",
  "data": {
    "id": "msg_1719000000_a1b2c3",
    "status": "success"
  }
}

消息 ID 生成规则

前端生成,格式为 msg_{timestamp}_{random},如 msg_1719000000_a1b2c3。确保唯一性即可。

详细的 WebSocket 协议请参考 WebSocket 消息类型


获取历史消息

GET JWT

/api/history

分页获取聊天历史消息,按时间升序返回。自动排除已撤回的消息。

查询参数

参数类型必填说明
typestring聊天类型:"single""group"
fromIdstring单聊必填发送方 ID(当前用户 ID)
toIdstring接收方 ID(对方用户 ID 或群 ID)
beforenumber时间戳,获取此时间之前的消息(用于向上翻页加载更多)
limitnumber每页数量,默认 50,最大 100

请求示例

bash
# 获取最近 50 条消息
curl "http://localhost:3000/api/history?type=single&fromId=u_abc123&toId=u_def456" \
  -H "Authorization: Bearer <token>"

# 加载更多(获取某时间戳之前的 50 条)
curl "http://localhost:3000/api/history?type=single&fromId=u_abc123&toId=u_def456&before=1719000000000&limit=50" \
  -H "Authorization: Bearer <token>"

# 获取群聊历史
curl "http://localhost:3000/api/history?type=group&toId=g_abc123" \
  -H "Authorization: Bearer <token>"

成功响应

json
{
  "code": 200,
  "data": [
    {
      "id": "msg_001",
      "from_id": "u_abc123",
      "to_id": "u_def456",
      "type": "single",
      "content": "你好!",
      "timestamp": 1719000000000,
      "content_type": "text",
      "reply_to": "",
      "image_url": ""
    }
  ],
  "hasMore": true
}

TIP

hasMoretrue 表示还有更早的消息可以加载。


撤回消息

POST JWT

/api/message/revoke

撤回已发送的消息。仅支持撤回自己的消息,且发送时间不超过 2 分钟。撤回后,相关用户会通过 WebSocket 收到 message_revoked 通知。

请求参数

字段类型必填说明
messageIdstring要撤回的消息 ID

请求示例

bash
curl -X POST http://localhost:3000/api/message/revoke \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <token>" \
  -d '{ "messageId": "msg_001" }'

成功响应

json
{
  "code": 200,
  "message": "消息已撤回"
}

错误场景

条件响应
非本人消息{ "code": 403, "msg": "只能撤回自己的消息" }
超过 2 分钟{ "code": 400, "msg": "超过撤回时限" }
消息不存在{ "code": 404, "msg": "消息不存在" }

消息内容类型

contentType说明content 字段
text文本消息文本内容
image图片消息图片 URL(配合 imageUrl 字段)

前端可根据 contentType 决定消息的渲染方式。默认值为 text