服务器端API
服务器端 API 是开放的,你可以使用自己熟悉的技术(例如 node.js、go、swift)实现自己的服务器端。
请参考以下 API 设计来开发自己的服务器端。
数据库设计参考
MySql 数据库参见 https://github.com/easysoft/xuanxuan/blob/master/ranzhi/db/xuanxuan.sql
Chat 表
存储会话数据。
名称 | 类型 | 必须/可选 | 说明 |
---|---|---|---|
id | number | 必须 | 存储在远程数据库的id,客户端根据此id值是否设置来判定是否为远程保存的对象 |
gid | string | 必须 | 当客户端向系统提交新的会话时,会创建全局唯一的id |
name | string | 可选 | 会话名称,当为空时,客户端会自动生成会话名称 |
type | string | 可选 | 表明会话类型:system(系统), one2one(一对一), gourp(多人讨论组), project, product等 |
admins | string | 可选 | 会话管理员用户列表 |
committers | string | 可选 | 会话允许发言用户清单 |
subject | int | 可选 | 主题会话关联的主题(product, project等)ID |
public | bool | 可选 | 是否公共会话 |
createdBy | string | 必须 | 创建者的账号 |
createdDate | datetime | 必须 | 创建会话时服务器的时间戳 |
editedBy | string | 可选 | 编辑者的账号 |
editedDate | datetime | 可选 | 编辑会话时服务器的时间戳 |
lastActiveTime | datetime | 可选 | 会话最后一次发送消息时服务器的时间戳 |
[users] | 关联数据集 | 必须 | 包含此会话的所有成员,和每个成员加入此会话的时间 |
[messages] | 关联数据集 | 必须 | 包含此会话的所有消息 |
Message 表
存储会话消息数据。
名称 | 类型 | 必须/可选 | 说明 |
---|---|---|---|
id | number | 必须 | 存储在远程数据库的id,客户端根据此id值是否设置来判定是否为远程保存的对象 |
gid | string | 必须 | 当客户端向系统提交新的消息时,会创建全局唯一的id |
cgid | string | 必须 | 此消息所属于的会话的gid属性,会话根据此值来查询包含的消息 |
user | string | 可选 | 此消息发送者的用户名,广播类的消息没有此值 |
date | number | 必须 | 消息发送的时间戳 |
type | string | 可选 | 消息的类型,为"normal"(默认), "broadcast" |
content | string | 必须 | 消息的内容,如果消息内容类型不是文本,则已此值为json格式的对象 |
contentType | string | 必须 | 消息内容的类型,为"text"(默认), "emoticon", "image", "file" |
UserMessageStatus
记录消息状态。
名称 | 类型 | 必须/可选 | 说明 |
---|---|---|---|
user | number | 必须 | 离线消息的目标用户id,对应用户表的id |
gid | string | 必须 | 当客户端向系统提交新的消息时,会创建全局唯一的id |
status | string | 必须 | 消息状态 |
ChatsOfUser 表
存储参与会话的成员数据。
名称 | 类型 | 必须/可选 | 说明 |
---|---|---|---|
id | number | 必须 | 存储在远程数据库的id |
cgid | string | 必须 | 会话的gid属性 |
user | number | 必须 | 用户id,对应用户表的id |
order | number | 可选 | 会话显示顺序 |
star | bool | 可选 | 用户是否收藏会话 |
hide | bool | 可选 | 用户是否隐藏会话 |
mute | bool | 可选 | 用户是否开启免打扰 |
quit | datetime | 可选 | 用户退出会话时服务器的时间戳 |
join | datetime | 必须 | 用户加入会话时服务器的时间戳 |
API说明
名词约定
client:喧喧客户端xxd:GO 聊天服务器xxb:后台ZDOO服务器
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 // 数据 }
xxd启动
xxd启动时会向xxb发送一条请求,xxb收到请求将所有用户状态重置为offline。
请求
方向:xxd → xxb
{ module: "chat", method: "serverStart" }
响应
方向:xxb -→ xxd
HTTP Status Code
登录
请求
方向:client → xxd
{ module: "chat", method: "login", params: [ serverName,// 多zdoo时客户端登录的服务器名称 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// 当前用户所在的zdoo站点地址(可选,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字段后,发送给此会话包含的所有在线用户。
重复登录
当同一用户重复登录时,系统会向前一个登录的用户推送一条特殊的消息,客户端接收到该消息后应该将用户登出,并关闭相关的网络连接。该消息不需要响应或返回结果。
方向:xxd → client
{ module: "chat", method: "kickoff", message: "This account logined in another place." }
获取所有用户列表
请求
方向: 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字段后,发送给此会话包含的所有在线用户。
获取当前登录用户所有会话数据
请求
方向: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字段后,发送给此会话包含的所有在线用户。
获取当前登录用户所有离线消息
请求
方向: 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字段后,发送给当前登录用户。
更改当前登录用户的信息
请求
方向: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字段后,发送给此会话包含的所有在线用户。
创建聊天会话
请求
方向:client → xxd
{ userID, module: "chat", method: "create", params: [ gid, // 会话的全局id, name, // 会话的名称 type, // 会话的类型 members: [309, 309...] // 会话的成员列表 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: [309, 309...] // 会话的成员列表 } }
方向:xxd → client
把xxb服务器响应给xxd服务器的信息去掉users字段后,发送给此会话包含的所有在线用户。
加入或退出聊天会话
用户可以加入类型为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: [309, 309...] // 会话的成员列表 } }
方向:xxd → client
把xxb服务器响应给xxd服务器的信息去掉users字段后,发送给此会话包含的所有在线用户(包括退出会话的当前用户)。
更改会话名称
用户可以更改类型为group的会话的名称。
请求
方向:client → xxd
{ userID, module: "chat", method: "changeName", params: [ gid, // 要更改的会话id name // 新的名称 ] }
方向: xxd → xxb
xxd把client发送的数据转发给xxb。
响应
方向:xxb → xxd
{ module: "chat", method: "changeName", result, users[], data: { // 会话的完整信息 id, // 会话在服务器数据保存的id gid, // 会话的全局id, name, // 会话的名称 type, // 会话的类型 admins, // 会话允许发言的用户列表 subject, // 主题会话的关联主题ID public, // 是否公共会话 createdBy, // 创建者用户名 createdDate, // 创建时间 editedBy, // 编辑者用户名 editedDate, // 编辑时间 lastActiveTime, // 会话最后一次发送消息的时间 members: [309, 309...] // 会话的成员列表 } }
方向:xxd → client
把xxb服务器响应给xxd服务器的信息去掉users字段后,发送给此会话包含的所有在线用户。
收藏或取消收藏会话
每个用户都可以单独决定收藏或取消收藏会话(加星标记)。
请求
方向:client → xxd
{ userID, module: "chat", method: "star", params: [ gid, // 要收藏会话id star // 可选, true收藏会话, false取消收藏会话, 默认为true ] }
方向: xxd → xxb
xxd把client发送的数据转发给xxb。
响应
方向:xxb → xxd
{ module: "chat", method: "star", result, users[], data: { // 会话的完整信息 gid, // 会话的全局id, star // true收藏会话, false取消收藏会话, 默认为true } }
方向:xxd → client
把xxb服务器响应给xxd服务器的信息去掉users字段后,发送给当前用户。
邀请新的用户到会话或者将用户踢出会话
请求
用户可以邀请一个或多个用户到类型为group的已有会话中;会话管理员可以将一个或多个用户踢出类型为group的会话。
方向:client → xxd
{ userID, module: "chat", method: "addmember", params: [ gid, // 要操作的会话id members, // 用户id数组 join // 可选, true邀请用户加入会话, false将用户踢出会话, 默认为true ] }
方向: xxd → xxb
xxd把client发送的数据转发给xxb。
响应
当新用户被添加到会话之后或者用户被踢出会话后,服务器应该主动推送此会话的信息给此会话的所有在线成员;此响应与chat/create/响应的结果一致。
方向:xxb → xxd
{ module: "chat", method: "addmember", result, users[], data: // 会话的完整信息 { id, // 会话在服务器数据保存的id gid, // 会话的全局id, name, // 会话的名称 type, // 会话的类型 admins, // 会话允许发言的用户列表 subject, // 主题会话的关联主题ID public, // 是否公共会话 createdBy, // 创建者用户名 createdDate, // 创建时间 editedBy, // 编辑者用户名 editedDate, // 编辑时间 lastActiveTime, // 会话最后一次发送消息的时间 members: [309, 309...] // 会话的成员列表 } }
方向:xxd → client
把xxb服务器响应给xxd服务器的信息去掉users字段后,发送给此会话包含的所有在线用户。
向会话发送消息
请求
用户向一个或多个会话中发送一条或多条消息,服务器推送此消息给此会话中的所有在线成员;当前不在线的成员会在下次上线时通过离线消息送达。
方向:client → xxd
{ userID, module: "chat", method: "message", params: [ // 一个包含一条或多条新消息的数组 { gid, // 此消息的gid cgid, // 此消息关联的会话的gid user, // 如果为空,则为发送此请求的用户 date, // 如果为空,则已服务器处理时间为准 type, // 消息的类型 contentType, // 消息内容的类型 content // 消息内容 }, // 可以在一个请求中发送多个消息 ] }
方向: xxd → xxb
xxd把client发送的数据转发给xxb。
响应
当有新的消息收到时,服务器会所有消息,并发送给对应会话的所有在线成员
方向: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字段后,发送给此会话包含的所有在线用户。
获取会话的所有消息记录
请求
方向:client → xxd
{ userID, module: "chat", method: "history", params: [ gid, // 要获取消息记录的会话gid recPerPage, // 每页记录数 pageID, // 当前也数 recTotal, // 总记录数 continued, // 是否继续获取历史记录 startDate, // 历史记录最早的日期时间戳(秒)(1.3新增) ] }
方向: xxd → xxb
xxd把client发送的数据转发给xxb。
响应
方向:xxb → xxd
{ module: "chat", method: "history", result, users[], data: [ { // 一条历史消息 gid, // 此消息的gid cgid, // 此消息关联的会话的gid user, // 如果为空,则为发送此请求的用户 date, // 如果为空,则已服务器处理时间为准 type, // 消息的类型 contentType, // 消息内容的类型 content // 消息内容 }, // 更多历史消息 ], pager: // 分页数据 { recPerPage, // 每页记录数 pageID, // 当前页数 recTotal, // 总记录数 gid, // 当前会话id continued // 是否继续获取历史记录 } }
方向:xxd → client
把xxb服务器响应给xxd服务器的信息去掉users字段后,发送给此会话包含的所有在线用户。
获取会话的所有成员信息
请求
方向:client → xxd
{ userID, module: "chat", method: "members", params: [ gid // 要获取成员列表的会话gid ] }
方向: xxd → xxb
xxd把client发送的数据转发给xxb。
响应
方向:xxb → xxd
{ module: "chat", method: "members", result, users[], data: [ { gid, // 此消息的gid members: [ { id, // ... } ] }, ] }
方向:xxd → client
把xxb服务器响应给xxd服务器的信息去掉users字段后,发送给此会话包含的所有在线用户。
隐藏或显示会话
每个用户都可以单独决定隐藏或显示已参与的会话。
请求
方向:client → xxd
{ userID, module: "chat", method: "hide", params: [ gid, // 要收藏会话id hide // 可选, true隐藏会话, false显示会话, 默认为true ] }
方向: xxd → xxb
xxd把client发送的数据转发给xxb。
响应
方向:xxb → xxd
{ module: "chat", method: "hide", result, users[], data: { gid, // 要隐藏或显示的会话id hide // true隐藏会话, false显示会话, 默认为true } }
方向:xxd → client
把xxb服务器响应给xxd服务器的信息去掉users字段后,发送给当前用户。
将会话设置为公共会话或者取消设置公共会话
用户可以将一个非主题会话设置为公共会话或者取消设置公共会话。
请求
方向:client → xxd
{ userID, module: "chat", method: "changePublic", params: [ gid, public, // 可选,true设置公共会话,false取消设置公共会话,默认为true ] }
方向: xxd → xxb
xxd把client发送的数据转发给xxb。
响应
方向:xxb → xxd
{ module: " chat"; method: "changepublic", result, users[], data: { // 会话的完整信息 id, // 会话在服务器数据保存的id gid, // 会话的全局id, name, // 会话的名称 type, // 会话的类型 admins, // 会话允许发言的用户列表 subject, // 主题会话的关联主题ID public, // 是否公共会话 createdBy, // 创建者用户名 createdDate, // 创建时间 editedBy, // 编辑者用户名 editedDate, // 编辑时间 lastActiveTime, // 会话最后一次发送消息的时间 members: [309, 309...] // 会话的成员列表 } }
方向:xxd → client
把xxb服务器响应给xxd服务器的信息去掉users字段后,发送给此会话包含的所有在线用户。
获取所有公共会话列表
请求
方向:client → xxd
{ userID, module: "chat", method: "getPublicList" }
方向: xxd → xxb
xxd把client发送的数据转发给xxb。
响应
方向:xxb → xxd
{ module: "chat", method: "getPublicList", result, users[], data: [ // 所有公共会话信息数组 { // 其中一个会话信息 id, gid, name, type, admins, subject, public, createdBy, createdDate, editedBy, editedDate, lastActiveTime }, // 更多会话数据... ] }
方向:xxd → client
把xxb服务器响应给xxd服务器的信息去掉users字段后,发送给此会话包含的所有在线用户。
设置会话管理员
请求
方向:client → xxd
{ userID, module: "chat", method: "setAdmin", params: [ gid, admins: [309,309...], // 指定的用户列表 isAdmin //可选, true允许指定用户发言, false禁止指定用户发言, 默认为true ] }
方向: xxd → xxb
xxd把client发送的数据转发给xxb。
响应
方向:xxb → xxd
{ module: "chat", method: "setAdmin", result, users[], data: { id, gid, name, type, admins, subject, public, createdBy, createdDate, editedBy, editedDate lastActiveTime } }
方向:xxd → client
把xxb服务器响应给xxd服务器的信息去掉users字段后,发送给此会话包含的所有在线用户。
设置会话允许发言的人
通过此功能可以设置会话白名单。
请求
方向:client → xxd
{ userID, module: "chat", method: "setCommitters", params: [ gid, committers: [309,309...] // 指定的用户列表 ] }
方向: xxd → xxb
xxd把client发送的数据转发给xxb。
响应
方向:xxb → xxd
{ module: "chat", method: "setCommitters", result, users[], data: { id, gid, name, type, admins, subject, public, createdBy, createdDate, editedBy, editedDate lastActiveTime } }
方向:xxd → client
把xxb服务器响应给xxd服务器的信息去掉users字段后,发送给此会话包含的所有在线用户。
上传下载用户在客户端的配置信息
请求
方向:client → xxd
{ userID, module: "chat", method: "settings", params: [ account, //用户名 settings //用户配置信息, 可选, 为空表示下载用户配置信息, 不为空表示上传用户配置信息, 默认为空 ] }
方向: xxd → xxb
xxd把client发送的数据转发给xxb。
响应
方向:xxb → xxd
{ module: "chat", method: "settings", users[], result, data // 用户配置信息 }
方向:xxd → client
把xxb服务器响应给xxd服务器的信息去掉users字段后,发送给当前登录用户。
为会话设置分组(1.3新增)
请求
方向:client → xxd
{ userID, module: "chat", method: "category", params: [ gids, // 要设置新的分组的会话 gid 数组 category, // 新的分组名称 ] }
方向: xxd → xxb
xxd把client发送的数据转发给xxb。
响应
方向:xxb → xxd
{ module: "chat", method: "category", users[], result, data: { gids, // 同参数 category // 同参数 } }
方向:xxd → client
把xxb服务器响应给xxd服务器的信息去掉users字段后,发送给当前登录用户。
管理员请求解散一个讨论组(1.3新增)
请求
方向:client → xxd
{ userID, module: "chat", method: "dismiss", params: [ gid, //要解散的讨论组gid ] }
方向: xxd → xxb
xxd把client发送的数据转发给xxb。
响应
方向:xxb → xxd
{ module: "chat", method: "dismiss", users[], result, data // 解散后的讨论组对象 }
方向:xxd → client
把xxb服务器响应给xxd服务器的信息去掉users字段后,发送给当前登录用户。
通知接口
请求
方向:xxd → xxb
{ module: "chat", method: "notify", params: [ offline:"", //离线用户 sendfail:"",//失败消息 ] }
响应:xxb → xxd
{ module: "chat", method: "notify", data: [ { id: [ { gid: //全局唯一ID title: //通知标题 subtitle: //通知副标题 content: //通知内容 date: //通知时间戳 contentType: //内容格式 url: //连接 read:false //是否已读 actions:[ { label: //操作标题 url: //操作指向 type: //操作类型 } ] sender:{ id: //发送方唯一标识 name: //应用名称 avatar: //发送方头像 } } ... ] } .... ] }
方向:xxd → client
如果有通知从xxd返回,则xxd会将消息分发给对应的用户
{ module: "chat", method: "notify", data: [ { gid: // 全局唯一ID title: // 通知标题 subtitle: // 通知副标题 content: // 通知内容 date: // 通知时间戳 contentType:// 内容格式 url: // 连接 read:false // 是否已读 actions:[ { label: // 操作标题 url: // 操作指向 type: // 操作类型 } ] sender:{ id: // 发送方唯一标识 name: // 应用名称 avatar: // 发送方头像 } } ... ] }
离线通知
请求
方向:xxd → xxb
用户登录的时候会请求未读的离线消息
{ module: "chat", method: "getOfflineNotify", userID: //用户ID }
响应:xxb → xxd
{ module: "chat", method: "notify", data: [ { gid: // 全局唯一ID title: // 通知标题 subtitle: // 通知副标题 content: // 通知内容 date: // 通知时间戳 contentType:// 内容格式 url: // 连接 read:false // 是否已读 actions:[ { label: // 操作标题 url: // 操作指向 type: // 操作类型 } ] sender:{ id: // 发送方唯一标识 name: // 应用名称 avatar: // 发送方头像 } } ... ] }
检测用户变更
请求
方向:xxd → xxb
用户登录的时候会请求未读的离线消息
{ module: "chat", method: "checkUserChange", params: "" }
响应:xxb → xxd
{ module: "chat", method: "checkUserChange", data: "yes" //是否有变更 yes或者no }
如果返回为yes,则会请求userGetlistAPI
上传文件
请求
方向:client → xxd
客户端通过 https 向 xxd 服务器发起 POST 请求。请求头部需要包含如下内容:
ServerName:zdoo服务器名称;
Authorization:用户 token;
请求表单需要包含如下字段:
file:文件域,包括文件名;
gid:该文件所属会话的 gid;
userID:当前用户 id;
以下为以 JavaScript 对象存储的请求数据示例:
{ headers: { ServerName: "ranzhiServer1", Authorization: "12345678888888888888888888888888" }, multipart: { { "Content-Disposition": "form-data; name="file"; filename="example.txt"", body: e.target.result }, { "Content-Disposition": "form-data; name="gid"", body: "1&2" } } }
方向: xxd → xxb
{ userID, module: "chat", method: "uploadFile", params: [ fileName, // 文件名(带扩展名) path, // 文件在xxd的路径 size, // 文件大小 time, // 时间戳 gid, // 会话ID ] }
xxd把client发送的数据转发给xxb。
响应
方向:xxb → xxd
{ module: "chat", method: "uploadFile", users[], result, data: fileID // 文件在zdoo服务器数据库存储的id }
方向:xxd → client
xxd 服务器在客户端发起的 POST 请求中以 JSON 文本格式返回文件基本信息。
{ result: "success", data: { url, // 文件在xxd服务器上的下载地址(可选,无此属性会按照规则生成 URL 地址) time, // 时间戳 id, // 文件 ID name, // 文件标题 } }
扩展列表
xxc登录成功后会向xxb发送一个请求,返回客户端的应用列表。
请求
方向:xxd → xxb
```js { module: "chat", method: "serverStart" userID: } ```
响应
方向:xxb → xxd
```js { result: "success", data: [ { entryID: //应用ID, name: //应用识别代码, displayName: //显示名称, abbrName: //名称简写, webViewUrl: //应用http访问地址, download: //扩展配置文件下载地址, md5: //扩展附件md5, logo: //应用LOGO }, ... ], users: } ```
应用免登录入口
请求
方向:client → xxb
{ module: "entry", method: "visit" params:{ entryID // 应用ID referer // 目标地址(可选) 设置此向登录成功后将跳转到此地址,否则跳转到应用的http
微信公众号