codecamp

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",


数据库设计参考
设置应用集成
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }