声明:本文档为接口文档,内容由 AI 辅助生成、博主整理优化,仅作本项目开发参考使用。


✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🎯 你正在阅读「Java项目-轻聊」系列文章 🎯
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

🔥 弹简特 个人主页

❄️ 个人专栏直通车:


靠热爱去书写自己,靠勇敢去书写生活!
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨


🌟 博主简介:


在这里插入图片描述


写在最前-项目同步码云

📦 项目源码 | 码云仓库


点击👉 点我看项目同步代码


轻聊 — 接口文档

文档说明

项目 说明
基础 URL http://127.0.0.1:8080
编码 UTF-8
认证方式 登录成功后使用 HttpSession(Cookie: JSESSIONID
数据格式 HTTP 接口多为 表单参数Query;响应多为 JSON(除头像二进制流)
WebSocket ws://127.0.0.1:8080/WebSocketMessage(需先 HTTP 登录)

通用约定

登录态

  • 登录成功:服务端创建 Session,属性 user 为当前用户对象。
  • 未登录或 Session 失效:需登录接口返回空用户(userId 为 0 或字段为空)或空列表、ok: false 等。

通用错误表现

场景 典型响应
未登录调用需登录接口 空对象、空数组,或 { ok: false, message: "未登录" }
参数无效 { ok: false, message: "..." }

一、用户模块

1.1 用户登录

内容
URL POST /login
Content-Type application/x-www-form-urlencoded
是否需登录

请求参数

参数 类型 必填 说明
username string 用户名
password string 密码(明文,与库中一致)

成功响应(200,JSON)

{
  "userId": 1,
  "username": "张三",
  "password": "",
  "avatarPath": null
}
字段 说明
userId 大于 0 表示成功
password 恒为空字符串,不返回真实密码

失败响应 A — 用户名或密码错误

{
  "userId": 0,
  "username": "",
  "password": "",
  "avatarPath": null
}

失败响应 B — 重复登录

{
  "userId": 0,
  "message": "该账号已在其他地方登录,请勿重复登录"
}

1.2 用户注册

内容
URL POST /register
是否需登录

请求参数

参数 类型 必填 说明
username string 用户名,唯一
password string 密码

成功响应

{
  "userId": 5,
  "username": "新用户",
  "password": "",
  "avatarPath": null
}

失败响应(用户名重复)

{
  "userId": 0,
  "username": "",
  "password": "",
  "avatarPath": null
}

1.3 退出登录

内容
URL POST /logout
是否需登录 建议已登录

响应

{
  "ok": true
}

副作用:Session 失效;该用户 WebSocket 连接被关闭。


1.4 获取当前用户信息

内容
URL GET /userInfo
是否需登录

成功响应

{
  "userId": 1,
  "username": "张三",
  "password": "",
  "avatarPath": "/avatars/xxx.jpg"
}

未登录响应userId 为 0 的空用户对象。


1.5 上传头像

内容
URL POST /user/uploadAvatar
Content-Type multipart/form-data
是否需登录

请求参数

参数 类型 必填 说明
file file 图片文件
userId int 必须为当前登录用户 ID

成功响应

{
  "ok": true,
  "avatarPath": "/avatars/xxxxxxxx.jpg",
  "avatarUrl": "/avatars/xxxxxxxx.jpg",
  "message": "头像上传成功"
}

失败响应示例

{ "ok": false, "message": "未登录" }
{ "ok": false, "message": "只能修改自己的头像" }
{ "ok": false, "message": "仅支持 jpg、jpeg、png 格式" }
{ "ok": false, "message": "图片大小不能超过 2MB" }

1.6 获取用户头像(二进制)

内容
URL GET /user/getAvatar?userId={userId}
是否需登录 否(建议登录后测)
响应 图片流;无头像时返回默认 SVG

1.7 搜索用户(加好友用)

内容
URL GET /search/user?keyword={keyword}
是否需登录

请求参数

参数 说明
keyword 用户名模糊匹配关键词

成功响应(JSON 数组)

[
  {
    "userId": 4,
    "username": "赵六",
    "avatarPath": null
  }
]

过滤规则(服务端):不包含自己;已是好友;已有待处理好友请求(双向)的用户不出现。


二、好友模块

2.1 好友列表

内容
URL GET /friendList
是否需登录

成功响应

[
  {
    "friendId": 2,
    "friendName": "李四",
    "avatarPath": "/avatars/xxx.jpg"
  }
]

未登录[]


三、好友请求模块

3.1 待处理好友请求列表

内容
URL GET /friend/request/list
是否需登录

成功响应

[
  {
    "requestId": 1,
    "fromUserId": 3,
    "fromName": "王五",
    "reason": "同学"
  }
]

3.2 发送好友请求

内容
URL POST /friend/request
是否需登录

请求参数

参数 类型 必填 说明
toUserId int 目标用户 ID
reason string 申请理由,默认空

成功响应

{
  "ok": true,
  "message": "好友请求已发送"
}

失败响应示例

message
未登录
目标用户无效
不能添加自己为好友
目标用户不存在
对方已是你的好友
已发送过好友请求,请勿重复提交
对方已向你发送好友请求,请在会话列表中处理

副作用:若对方 WebSocket 在线,推送 type=FRIEND_REQUEST 消息。


3.3 处理好友请求

内容
URL POST /friend/handle
是否需登录

请求参数

参数 类型 必填 说明
requestId int 请求 ID
action string acceptreject

成功响应

{
  "ok": true,
  "message": "已同意好友请求"
}

{
  "ok": true,
  "message": "已拒绝好友请求"
}

同意副作用:双向写入 friend 表;删除该请求;向双方 WebSocket 推送 type=FRIEND_ACCEPTED


四、会话模块

4.1 会话列表

内容
URL GET /sessionList
是否需登录

成功响应

[
  {
    "sessionId": 1,
    "friends": [
      {
        "friendId": 2,
        "friendName": "李四",
        "avatarPath": null
      }
    ],
    "lastMessage": "晚上见"
  }
]
字段 说明
friends 会话中除自己外的成员(单聊为 1 人)
lastMessage 该会话最新一条消息内容,无则 ""

规则:同一好友多个 session 时,列表只保留一条(有最后消息优先,否则 sessionId 较小者)。


4.2 创建会话

内容
URL POST /session?toUserId={toUserId}
是否需登录 是(依赖 Session 属性 user

请求参数

参数 说明
toUserId 对方用户 ID

成功响应

{
  "sessionId": 3
}

规则:两人已有会话则直接返回已有 sessionId,不重复创建。


五、消息模块

5.1 历史消息

内容
URL GET /message?sessionId={sessionId}
是否需登录 否(前端在登录后调用)

成功响应(JSON 数组,时间升序,最多 100 条)

[
  {
    "messageId": 1,
    "fromId": 1,
    "fromName": "张三",
    "sessionId": 1,
    "content": "晚上吃什么",
    "avatarPath": "/avatars/xxx.jpg"
  }
]

六、WebSocket 接口

6.1 连接

内容
URL ws://127.0.0.1:8080/WebSocketMessage
握手 携带与 HTTP 相同的 Cookie(JSESSIONID)
拦截器 HttpSessionHandshakeInterceptor 将 Session 中 user 写入 WS 属性

连接失败场景:未登录时 user 为空,连接建立但不登记在线。

重复连接:同 userId 已有 WS 时,新连接被拒绝关闭(先登录的浏览器保持在线)。


6.2 客户端 → 服务端(发送聊天消息)

文本帧 JSON:

{
  "type": "message",
  "sessionId": 1,
  "content": "你好"
}
字段 必填 说明
type 固定 message
sessionId 会话 ID
content 消息正文

服务端行为:解析后转发给对方与自己(用于刷新 UI),并写入 message 表。两人之间存在 canonical sessionId 时,以较小 sessionId 落库。


6.3 服务端 → 客户端(推送)

6.3.1 聊天消息
{
  "type": "message",
  "fromId": 1,
  "fromName": "张三",
  "content": "你好",
  "sessionId": 1,
  "sessionName": "李四",
  "avatarPath": "/avatars/xxx.jpg"
}
字段 说明
sessionName 接收方会话列表标题:对方看发送者名;发送方看自己会话中对方名
6.3.2 好友请求通知
{
  "type": "FRIEND_REQUEST",
  "requestId": 2,
  "fromUserId": 3,
  "fromName": "王五",
  "reason": "认识一下"
}
6.3.3 好友请求被同意
{
  "type": "FRIEND_ACCEPTED",
  "friendUserId": 3,
  "friendName": "王五"
}

6.4 测试 WebSocket(回显,非业务)

| URL | ws://127.0.0.1:8080/chat |
| 说明 | TestWebSocketController,原样回显,无需登录 |


七、静态资源

路径 说明
/login.html 登录页
/register.html 注册页
/client.html 主界面
/avatars/{filename} 上传头像访问(映射 upload/avatars)
/img/default-avatar.svg 默认头像

八、接口测试检查清单(汇总)

模块 接口数 建议顺序
用户 7 注册 → 登录 → userInfo → 头像 → 搜索
好友 1 friendList
好友请求 3 发送 → 列表 → 同意/拒绝
会话 2 sessionList → 创建 session
消息 1 历史 message
WebSocket 1 连接 + 3 类推送 登录后连接,双用户互发

OK,老铁们,我们接口文档约束好之后,后续我们就开始一步一步实现项目的开发了~
咱们下一期就从用户管理模块开始。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐