====== 在线状态订阅 RESTful API ====== 更新时间:2022-06-22 本文展示如何调用环信即时通讯 RESTful API 实现用户在线状态订阅,包括设置用户在线状态信息、批量订阅和获取在线状态、取消订阅以及查询订阅列表。调用以下方法前,请先参考 [[ccim:limitation|使用限制]] 了解即时通讯 RESTful API 的调用频率限制。 使用该特性前,你需要联系商务开通。 ===== 公共参数 ===== 以下表格列举了即时通讯 RESTful API 的公共请求参数和响应参数: ==== 请求参数 ==== ^参数 ^类型 ^描述 ^是否必填^ |''%%host%%'' |String |你在环信即时通讯云控制台注册项目时所在的集群服务器地址。 |是 | |''%%org_name%%'' |String |即时通讯服务分配给每个企业(组织)的唯一标识。你可以通过控制台获取该字段。 |是 | |''%%app_name%%'' |String |你在环信即时通讯云控制台注册项目时填入的应用名称。 |是 | |''%%uid%%'' |String |用户在即时通讯服务器上的唯一 ID。 |是 | ==== 响应参数 ==== ^参数 ^描述 ^ |''%%data%%'' |实际取到的数据详情。 | |''%%username%%'' |用户 ID。 | |''%%groupname%%'' |群组名。 | |''%%timestamp%%'' |请求响应的时间,Unix 时间戳,单位为 ms。 | ===== 认证方式 ===== 环信即时通讯 RESTful API 要求 Bearer HTTP 认证。每次发送 HTTP 请求时,都必须在请求头部填入如下 Authorization 字段: ''%%Authorization: Bearer ${YourAppToken}%%'' 为提高项目的安全性,环信使用 Token(动态密钥)对即将登录即时通讯系统的用户进行鉴权。即时通讯 RESTful API 建议使用 App Token 的鉴权方式,详见 [[https://docs-im.easemob.com/ccim/authentication|使用 Token 鉴权]]。 ===== 设置用户在线状态信息 ===== 根据用户的唯一 ID 设置在线状态信息。 ==== HTTP 请求 ==== ''%%POST https://{host}/{org_name}/{app_name}/users/{uid}/presence/{resource}/{status}%%'' === 路径参数 === ^参数 ^类型 ^描述 ^是否必填 ^ |''%%resource%%'' |String |设备来源,格式为设备类型 + resource ID,例如,android_123423453246。 |是 | |''%%status%%'' |String |端状态码。该参数的取值如下:
- ''%%0%%'':离线;
- ''%%1%%'':在线;
- 其他值:自定义在线状态。 |是 | 其他参数及说明详见[[https://docs-im.easemob.com/ccim/rest/presence#公共参数|公共参数]]。 === 请求 header === ^参数 ^类型 ^描述 ^是否必填 ^ |''%%Content-Type%%'' |String |内容类型:''%%application/json%%''。 |是 | |''%%Authorization%%'' |String |''%%Bearer ${token}%%'' Bearer 是固定字符,后面加英文空格,再加上获取到的 app token 的值。 |是 | === 请求体 body === 请求包体为 JSON Object 类型,包含以下字段: ^参数 ^类型 ^描述 ^是否必填 ^ |''%%ext%%'' |String |在线状态扩展信息。建议不超过 64 字节。 |是 | ==== HTTP 响应 ==== === 响应 body === 如果返回的 HTTP 状态码为 ''%%200%%'',表示请求成功,响应包体中包含以下字段: ^字段 ^类型 ^说明 ^ |''%%result%%'' |String |操作结果。设置成功返回 ’ok’,否则返回相应的错误原因。 | 如果返回的 HTTP 状态码非 ''%%200%%'',表示请求失败。你可以参考 [[https://docs-im.easemob.com/ccim/rest/errorcode|错误码]] 了解可能的原因。 ==== 示例 ==== === 请求示例 === curl -X POST 'a1-test.easemob.com:8089/5101220107132865/test/users/c1/presence/android/0' \ -H 'Authorization: Bearer YWMtnjEbUopPEeybKGMmN0wpeZsaLSh8UEgpirS4wNAM_qx8oS2wik8R7LE4Rclv5hu9AwMAAAF-4tr__wBPGgDWGAeO86wl2lHGeTnU030fpWuEDR015Vk6ULWGYGKccA' \ -H 'Content-Type: application/json' \ -d '{"ext":"123"}' === 响应示例 === {"result":"ok"}% ===== 批量订阅在线状态 ===== 你一次可订阅多个用户的在线状态。 ==== HTTP 请求 ==== ''%%POST https://{host}/{org_name}/{app_name}/users/{uid}/presence/{expiry}%%'' === 路径参数 === ^参数 ^类型 ^描述 ^是否必填 ^ |''%%expiry%%'' |String |订阅时长,单位为秒,最长为 30 天。 |是 | 其他参数及说明详见[[https://docs-im.easemob.com/ccim/rest/presence#公共参数|公共参数]]。 === 请求 header === ^参数 ^类型 ^描述 ^是否必填 ^ |''%%Content-Type%%'' |String |内容类型:''%%application/json%%''。 |是 | |''%%Authorization%%'' |String |''%%Bearer ${token}%%'' Bearer 是固定字符,后面加英文空格,再加上获取到的 App Token 的值。 |是 | === 请求 body === 请求包体为 JSON Object 类型,包含以下字段: ^字段 ^类型 ^描述 ^是否必填 ^ |''%%usernames%%'' |JSON ARRAY |订阅对象的用户名数组,例如 [“user1”, “user2”]。该数组最多可包含 100 个用户名。 |是 | ==== HTTP 响应 ==== === 响应 body === 如果返回的 HTTP 状态码为 ''%%200%%'',表示请求成功,响应包体中包含以下字段: ^字段 ^类型 ^描述 ^ |''%%result%%'' |JSON Array |订阅对象的在线状态信息,以数组形式返回。若订阅失败,返回相应的错误原因。 | |''%%uid%%'' |String |用户在即时通讯服务器的唯一 ID。 | |''%%last_time%%'' |Number |用户最近在线时间。服务端会在被订阅的用户登录和登出时记录该时间。 | |''%%expiry%%'' |Number |订阅的过期时间戳。 | |''%%ext%%'' |String |用户在线状态扩展信息,建议不超过 64 字节。 | |''%%status%%'' |JSON Array |用户多端的状态。该参数的取值如下:
- ''%%0%%'':离线;
- ''%%1%%'':在线;
- 其他值:用户可设置其他值自定义在线状态。 | 如果返回的 HTTP 状态码非 ''%%200%%'',表示请求失败。你可以参考 [[https://docs-im.easemob.com/ccim/rest/errorcode|错误码]] 了解可能的原因。 ==== 示例 ==== === 请求示例 === curl -X POST 'a1-test.easemob.com:8089/5101220107132865/test/users/wzy/presence/1000' \ -H 'Authorization: Bearer YWMtnjEbUopPEeybKGMmN0wpeZsaLSh8UEgpirS4wNAM_qx8oS2wik8R7LE4Rclv5hu9AwMAAAF-4tr__wBPGgDWGAeO86wl2lHGeTnU030fpWuEDR015Vk6ULWGYGKccA' \ -H 'Content-Type: application/json' \ -d '{"usernames":["c2","c3"]}' === 响应示例 === {"result":[{"uid":"","last_time":"1644466063","expiry":"1645500371","ext":"123","status":{"android":"1","android_6b5610ac-4e11-4661-82b3-dee17bc7b2cc":"0"}},{"uid":"c3","last_time":"1645183991","expiry":"1645500371","ext":"","status":{"android":"0","android_6b5610ac-4e11-4661-82b3-dee17bc7b2cc":"0"}}]}% ===== 批量获取在线状态信息 ===== 你一次可获取多个用户的在线状态信息。 ==== HTTP 请求 ==== ''%%POST https://{host}/{org_name}/{app_name}/users/{uid}/presence%%'' === 路径参数 === 参数及说明详见[[https://docs-im.easemob.com/ccim/rest/presence#公共参数|公共参数]]。 === 请求 header === ^参数 ^类型 ^描述 ^是否必填 ^ |''%%Content-Type%%'' |String |内容类型:''%%application/json%%''。 |是 | |''%%Authorization%%'' |String |''%%Bearer ${token}%%'' Bearer 是固定字符,后面加英文空格,再加上获取到的 App Token 的值。 |是 | === 请求 body === 请求包体为 JSON Object 类型,仅支持以下字段: ^参数 ^类型 ^是否必需 ^说明 ^ |''%%usernames%%'' |Array |必需 |订阅对象的用户名数组,例如 [“user1”, “user2”]。该数组最多可包含 100 个用户名。 | ==== HTTP 响应 ==== === 响应 body === 如果返回的 HTTP 状态码为 ''%%200%%'',表示请求成功,响应包体中包含以下字段: ^参数 ^类型 ^说明 ^ |''%%result%%'' |JSON Array |订阅对象的在线状态信息,以数组形式返回。若订阅失败,返回相应的错误原因。 | |''%%uid%%'' |String |用户在即时通讯服务器的唯一 ID。 | |''%%last_time%%'' |Number |用户最近在线时间。 | |''%%ext%%'' |String |用户在线状态的扩展信息,建议不超过 64 字节。 | |''%%status%%'' |JSON Array |用户多端的状态。 | 如果返回的 HTTP 状态码非 ''%%200%%'',表示请求失败。你可以参考[[https://docs-im.easemob.com/ccim/rest/errorcode|错误码]]了解可能的原因。 ==== 示例 ==== === 请求示例 === curl -X POST 'a1-test.easemob.com:8089/5101220107132865/test/users/wzy/presence' \ -H 'Authorization: Bearer YWMtnjEbUopPEeybKGMmN0wpeZsaLSh8UEgpirS4wNAM_qx8oS2wik8R7LE4Rclv5hu9AwMAAAF-4tr__wBPGgDWGAeO86wl2lHGeTnU030fpWuEDR015Vk6ULWGYGKccA' \ -H 'Content-Type: application/json' \ -d '{"usernames":["c2","c3"]}' === 响应示例 === { "result":[ { "uid":"c2", "last_time":"1644466063", "ext":"", "status":{ "android":"0"} }, { "uid":"c3", "last_time":"1644475330", "ext":"", "status":{ "android":"0", "android":"0"} }] } ===== 取消订阅 ===== 你可以取消订阅用户的在线状态。 ''%%DELETE https://{host}/{org_name}/{app_name}/users/{uid}/presence%%'' ==== 路径参数 ==== 参数及说明详见[[https://docs-im.easemob.com/ccim/rest/presence#公共参数|公共参数]]。 ==== 请求 header ==== ^参数 ^类型 ^描述 ^是否必填 ^ |''%%Content-Type%%'' |String |内容类型:''%%application/json%%''。 |是 | |''%%Authorization%%'' |String |''%%Bearer ${token}%%'' Bearer 是固定字符,后面加英文空格,再加上获取到的 App Token 的值。 |是 | ==== 请求 body ==== ^参数 ^类型 ^描述 ^是否必填 ^ |''%%users%%'' |Array |订阅对象的用户名数组,例如 [“user1”, “user2”]。该数组最多可包含 100 个用户名。 |是 | ==== HTTP 响应 ==== === 响应 body === 如果返回的 HTTP 状态码为 ''%%200%%'',表示请求成功,响应包体中包含以下字段: ^参数 ^类型 ^说明 ^ |''%%result%%'' |String |取消成功返回“ok”;取消失败返回相应的错误原因。 | 如果返回的 HTTP 状态码非 ''%%200%%'',表示请求失败。你可以参考[[https://docs-im.easemob.com/ccim/rest/errorcode|错误码]]了解可能的原因。 ==== 示例 ==== === 请求示例 === curl -X DELETE 'a1-test.easemob.com:8089/5101220107132865/test/users/wzy/presence' \ -H 'Authorization: Bearer YWMtnjEbUopPEeybKGMmN0wpeZsaLSh8UEgpirS4wNAM_qx8oS2wik8R7LE4Rclv5hu9AwMAAAF-4tr__wBPGgDWGAeO86wl2lHGeTnU030fpWuEDR015Vk6ULWGYGKccA' \ -H 'Content-Type: application/json' \ -d '["c1"]' === 响应示例 === {"result":"ok"}% ===== 查询订阅列表 ===== 查询当前用户已订阅在线状态的用户列表。 ==== HTTP 请求 ==== ''%%GET https://{host}/{org_name}/{app_name}/users/{uid}/presence/sublist?pageNum=1&pageSize=100%%'' === 路径参数 === ^参数 ^类型 ^描述 ^是否必填 ^ |''%%pageNum%%'' |int |要查询的页码。该参数的值须大于等于 1。 |是 | |''%%pageSize%%'' |int |每页显示的订阅用户数量。 该参数的值不得超 500。 |是 | 其他参数及说明详见[[https://docs-im.easemob.com/ccim/rest/presence#公共参数|公共参数]]。 === 请求 header === ^参数 ^类型 ^是否必需 ^描述 ^ |''%%Content-Type%%'' |String |必需 |内容类型:''%%application/json%%''。 | |''%%Authorization%%'' |String |必需 |''%%Bearer ${token}%%'' Bearer 是固定字符,后面加英文空格,再加上获取到的 App Token 的值。 | ==== HTTP 响应 ==== === 响应 body === 如果返回的 HTTP 状态码为 ''%%200%%'',表示请求成功,响应包体中包含以下字段: ^参数 ^类型 ^说明 ^ |''%%result%%'' |Object |订阅对象在线状态信息,以数组形式返回。若查询失败,返回相应的错误原因。 | |''%%totalnum%%'' |String |当前订阅的用户总数。 | |''%%sublist%%'' |Object |订阅对象的信息,以数组形式返回。 | |''%%uid%%'' |String |用户在即时通讯服务器的唯一 ID。 | |''%%expiry%%'' |String |订阅的过期时间戳。 | 如果返回的 HTTP 状态码非 ''%%200%%'',表示请求失败。你可以参考[[https://docs-im.easemob.com/ccim/rest/errorcode|错误码]]了解可能的原因。 ==== 示例 ==== === 请求示例 === curl -X GET 'a1-test.easemob.com:8089/5101220107132865/test/users/wzy/presence/sublist?pageNum=1&pageSize=100' \ -H 'Authorization: Bearer YWMtnjEbUopPEeybKGMmN0wpeZsaLSh8UEgpirS4wNAM_qx8oS2wik8R7LE4Rclv5hu9AwMAAAF-4tr__wBPGgDWGAeO86wl2lHGeTnU030fpWuEDR015Vk6ULWGYGKccA' \ -H 'Content-Type: application/json' === 响应示例 === { "result":{ "totalnum":"2", "sublist":[ { "uid":"lxml2", "expiry":"1645822322"}, { "uid":"lxml1", "expiry":"1645822322"} ] } }