API说明
名词约定
client:喧喧客户端xxd:GO 聊天服务器xxb:后台然之服务器
1.API数据格式
常见的请求对象格式
{ userID, // 用户id,xxd → xxb 非登录时必须 module, // 模块名称,必须 method, // 方法名称,必须 test, // 可选参数,bool,默认为false。 params, // 参数对象,可选 data // 请求数据,可选,与params配合使用,通常data传输是对象 }
常见的响应数据格式
{ module, // 模块名称,必须 method, // 方法名称,必须 users[], // 该数据响应给哪些用户,users为空表示所有在线用户 params, // 参数对象,可选 result:, // 响应状态,可为"success"(成功), "fail"(失败), "denied"(拒绝,需要登录), message:,// 消息,可选,当result不为success时,使用此字段来解释原因 data // 数据 }
2.xxd启动
xxd启动时会向xxb发送一条请求,xxb收到请求将所有用户状态重置为offline。
请求
方向:xxd → xxb
{ module: "chat", method: "serverStart" }
响应
方向:xxb -→ xxd
HTTP Status Code
登录
请求
方向:client → xxd
{ module: "chat", method: "login", params: [ serverName,// 多然之时客户端登录的服务器名称 account, // 用户名 password, // 加密后的密码 status // 登录后设置的状态,包括online,away,busy ] }
方向:xxd → xxb
xxd服务器根据module、method和serverName把请求发送给指定的xxb
响应
方向:xxb → xxd
{ module: "chat", method: "login", result, users[], data: { // 当前登录的用户数据 id, // ID account, // 用户名 realname,// 真实姓名 avatar, // 头像URL role, // 角色 dept, // 部门ID status, // 当前状态 admin, // 是否超级管理员,super 超级管理员 | no 普通用户 gender, // 性别,u 未知 | f 女 | m 男 email, // 邮箱 mobile, // 手机 site, // 网站 phone, // 电话 ranzhiUrl// 当前用户所在的然之站点地址(可选,1.3新增) } }
登录成功以后xxd主动从xxb服务器获取用户列表、用户所参与的会话信息和用户的离线消息发送给当前客户端。最后把xxb服务器响应给xxd服务器的登录信息去掉users字段后,发送给此会话包含的所有在线用户。
登出
请求
方向:client → xxd
{ userID, //登出用户的id号 module: "chat", method: "logout", }
方向:xxd → xxb
xxd把client发送的数据转发给xxb。
响应
方向 xxb → xxd
{ module: "chat", method: "logout", result, users[], data: { // 当前登录的用户数据 id, // ID account, // 用户名 realname,// 真实姓名 avatar, // 头像URL role, // 角色 dept, // 部门ID status, // 当前状态 admin, // 是否超级管理员,super 超级管理员 | no 普通用户 gender, // 性别,u 未知 | f 女 | m 男 email, // 邮箱 mobile, // 手机 site, // 网站 phone // 电话 } }
方向:xxd → client
把xxb服务器响应给xxd服务器的登出信息去掉users字段后,发送给此会话包含的所有在线用户。
3.重复登录
当同一用户重复登录时,系统会向前一个登录的用户推送一条特殊的消息,客户端接收到该消息后应该将用户登出,并关闭相关的网络连接。该消息不需要响应或返回结果。
方向:xxd → client
{ module: "chat", method: "kickoff", message: "This account logined in another place." }
4.获取所有用户列表
请求
方向: client → xxd
{ userID, //用户的id号 module: "chat", method: "userGetlist", params: [ idList, // 要获取的用户信息id编号数组,可选,如果留空则获取所有用户(1.3新增) ] }
方向: xxd → xxb
xxd把client发送的数据转发给xxb。
响应
方向:xxb → xxd
{ module: "chat", method: "userGetlist", result, users[], data: [ // 所有用户状态数组 { // 其中一个用户数据 id, // ID account, // 用户名 realname, // 真实姓名 avatar, // 头像URL role, // 角色 dept, // 部门ID status, // 当前状态 admin, // 是否超级管理员,super 超级管理员 | no 普通用户 gender, // 性别,u 未知 | f 女 | m 男 email, // 邮箱 mobile, // 手机 site, // 网站 phone // 电话 }, // 更多用户数据... ], roles: { "dev": "开发者", "productManager": "产品经理" // 更多角色表数据,格式为键名为角色代号,键值为角色显示名称 }, depts: [ {id: 2343, name: "研发部", parent: 0}, {id: 2344, name: "项目部", parent: 2343}, // 更多部门表数据,每个对象表示一个部门信息,parent 为上级部门id,如果没有上级部门parent值为0 ] }
方向:xxd → client
把xxb服务器响应给xxd服务器的信息去掉users字段后,发送给此会话包含的所有在线用户。
5.获取当前登录用户所有会话数据
请求
方向:client → xxd
{ userID, module: "chat", method: "getList", }
方向: xxd → xxb
xxd把client发送的数据转发给xxb。
响应
方向:xxb → xxd
{ module: "chat", method: "getList", result, users[], data: [ // 所有会话信息数组 { // 其中一个会话信息 id, // 会话在服务器数据保存的id gid, // 会话的全局id, name, // 会话的名称 type, // 会话的类型 admins, // 会话允许发言的用户列表 subject, // 主题会话的关联主题ID public, // 是否公共会话 createdBy, // 创建者用户名 createdDate, // 创建时间 editedBy, // 编辑者用户名 editedDate, // 编辑时间 lastActiveTime, // 会话最后一次发送消息的时间 star, // 当前登录用户是否收藏此会话 hide, // 当前登录用户是否隐藏此会话 members: [ // 当前会话中包含的所有用户信息,只需要包含id即可 { id, //用户id }, // 更多用户... ], }, // 更多会话数据... ] }
方向:xxd → client
把xxb服务器响应给xxd服务器的信息去掉users字段后,发送给此会话包含的所有在线用户。
6.获取当前登录用户所有离线消息
请求
方向: xxd → xxb
{ userID, module: "chat", method: "getOfflineMessages", }
响应
方向:xxb → xxd
{ module: "chat", method: "message", result, users[], data: // 一个包含一条或多条离线消息的数组 [ { // 其中一条离线消息 id, // 消息在服务器保存的id gid, // 此消息的gid cgid, // 此消息关联的会话的gid user, // 消息发送的用户名 date, // 消息发送的时间 type, // 消息的类型 contentType, // 消息内容的类型 content, // 消息内容 }, // 更多离线消息 ] }
方向:xxd → client
把xxb服务器响应给xxd服务器的信息去掉users字段后,发送给当前登录用户。
7.更改当前登录用户的信息
请求
方向:client → xxd
{ userID, module: "chat", method: "userChange", params: [ // 更改后的用户 user: // 一个用户对象 { id, // ID account, // 用户名 realname, // 真实姓名 avatar, // 头像URL role, // 角色 dept, // 部门ID status, // 要设置的新状态,包括online, away, busy admin, // 是否超级管理员,super 超级管理员 | no 普通用户 gender, // 性别,u 未知 | f 女 | m 男 email, // 邮箱 mobile, // 手机 site, // 网站 phone // 电话 } ] }
方向: xxd → xxb
xxd把client发送的数据转发给xxb。
响应
方向:xxb → xxd
{ module: "chat", method: "userChange", result, users[], data: { //当前登录用户数据 id, // ID account, // 用户名 realname, // 真实姓名 avatar, // 头像URL role, // 角色 dept, // 部门ID status, // 状态 admin, // 是否超级管理员,super 超级管理员 | no 普通用户 gender, // 性别,u 未知 | f 女 | m 男 email, // 邮箱 mobile, // 手机 site, // 网站 phone // 电话 } }
方向:xxd → client
把xxb服务器响应给xxd服务器的信息去掉users字段后,发送给此会话包含的所有在线用户。
8.创建聊天会话
请求
方向:client → xxd
{ userID, module: "chat", method: "create", params: [ gid, // 会话的全局id, name, // 会话的名称 type, // 会话的类型 members: [{id}, {id}...] // 会话的成员列表 subject, //可选,主题会话的关联主题ID,默认为0 pulic //可选,是否公共会话,默认为false ] }
方向: xxd → xxb
xxd把client发送的数据转发给xxb。
响应
服务器在创建会话时应该先检查gid是否已经存在,如果存在则直接为当前登录用户返回已存在的会话信息。
方向:xxb → xxd
{ module: "chat", method: "create", result, users[], data: { // 新创建的会话完整信息 id, // 会话在服务器数据保存的id gid, // 会话的全局id, name, // 会话的名称 type, // 会话的类型 admins, // 会话允许发言的用户列表 subject, // 主题会话的关联主题ID public, // 是否公共会话 createdBy, // 创建者用户名 createdDate, // 创建时间 editedBy, // 编辑者用户名 editedDate, // 编辑时间 lastActiveTime, // 会话最后一次发送消息的时间 members: [{id}, {id}...] // 会话的成员列表 } }
方向:xxd → client
把xxb服务器响应给xxd服务器的信息去掉users字段后,发送给此会话包含的所有在线用户。
9.加入或退出聊天会话
用户可以加入类型为group并且公共的会话;用户可以退出类型为group的会话。
请求
方向:client → xxd
{ userID, module: "chat", method: "joinchat", params: [ gid, // 要加入或退出的会话id join // 可选, true加入会话, false退出会话, 默认为true ] }
方向: xxd → xxb
xxd把client发送的数据转发给xxb。
响应
方向:xxb → xxd
{ module: "chat", method: "joinchat", result, users[], data: { // 会话的完整信息 id, // 会话在服务器数据保存的id gid, // 会话的全局id, name, // 会话的名称 type, // 会话的类型 admins, // 会话允许发言的用户列表 subject, // 主题会话的关联主题ID public, // 是否公共会话 createdBy, // 创建者用户名 createdDate, // 创建时间 editedBy, // 编辑者用户名 editedDate, // 编辑时间 lastActiveTime, // 会话最后一次发送消息的时间 members: [{id}, {id}...] // 会话的成员列表 } }
方向:xxd → client
把xxb服务器响应给xxd服务器的信息去掉users字段后,发送给此会话包含的所有在线用户(包括退出会话的当前用户)。
10.更改会话名称
用户可以更改类型为group的会话的名称。
请求
方向:client → xxd
{ userID, module: "chat", method: "changeName", params: [ gid, // 要更改的会话id name // 新的名称 ] }
方向: xxd → xxb
xxd把client发送的数据转发给xxb。
响应
方向:xxb → xxd
{ module: "chat",
更多建议: