服务器端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: [449, 449...] // 会话的成员列表
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: [449, 449...] // 会话的成员列表
}
}
方向: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: [449, 449...] // 会话的成员列表
}
}
方向: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: [449, 449...] // 会话的成员列表
}
}
方向: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: [449, 449...] // 会话的成员列表
}
}
方向: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: [449, 449...] // 会话的成员列表
}
}
方向: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: [449,449...], // 指定的用户列表
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: [449,449...] // 指定的用户列表
]
}
方向: 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

联系我们
社群交流