human: 如何处理七牛云的实时音视频房间管理

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > 服务端 >房间管理

#  房间管理

最近更新时间: 2023-07-27 18:02:28

这一部分服务是为了让您的业务后台能够自动地完成一些在控制台上需要完成的操作，比如查看房间成员列表，踢出指定用户等。

一次连麦过程，多个终端音视频通信行为的管理是通过 room 进行的。一个连麦房间必然属于某一个 app。房间无需主动创建或删除，用户直接使用客户端 sdk
指定某个 app 和 room 进行连麦即可加入房间。通过接口可以查询 app  
下所有的活跃房间，也可以对某一个房间做相关的业务操作。

同样，您也可以使用服务端 SDK 提供的方法来完成下列操作，具体请参照相应的 SDK 文档。这里只说明手动发送控制请求的情况。

对于这些服务，我们统一封装了 Restful 的接口方便给您调用，在调用各个接口之前，您还需要在 http headers 中添加鉴权头以识别您的权限。

## HTTP 请求鉴权

Qiniu RTC Server API 通过 Qiniu Authorization 方式进行鉴权，每个房间管理 HTTP 请求头部需增加一个
Authorization 字段：

    
    
    Authorization: "<QiniuToken>"
    

QiniuToken 是管理凭证，用于鉴权。

使用七牛颁发的AccessKey和SecretKey，对本次 http 请求的信息进行签名，生成管理凭证。签名的原始数据包括 http 请求的
Method, Path, RawQuery, Content-Type 及 Body  
等信息，这些信息的获取方法取决于具体所用的编程语言，建议参照七牛提供的 SDK 代码。 计算过程及伪代码如下：

    
    
    // 1.构造待签名的 Data
    // 添加 Method 和 Path
    data = "<Method> <Path>"
    // 添加 Query，如果Query不存在或者为空，则跳过此步
    if "<RawQuery>" != "" {
        data += "?<RawQuery>"
    }
    // 添加 Host
    data += "\nHost: <Host>"
    // 添加 Content-Type，如果Content-Type不存在或者为空，则跳过此步
    if "<Content-Type>" != "" {
        data += "\nContent-Type: <Content-Type>"
    }
    // 添加回车
    data += "\n\n"
    // 添加 Body， 如果Content-Length, Content-Type和Body任意一个不存在或者为空，则跳过此步；如果Content-Type为application/octet-stream，也跳过此步
    bodyOK := "<Content-Length>" != "" && "<Body>" != ""
    contentTypeOK := "<Content-Type>" != "" && "<Content-Type>" != "application/octet-stream"
    if bodyOK && contentTypeOK {
        data += "<Body>"
    }
    // 2. 计算 HMAC-SHA1 签名，并对签名结果做 URL 安全的 Base64 编码
    sign = hmac_sha1(data, "Your_Secret_Key")
    encodedSign = urlsafe_base64_encode(sign)
    // 3. 将 Qiniu 标识与 AccessKey、encodedSign 拼接得到管理凭证
    <QiniuToken> = "Qiniu " + "Your_Access_Key" + ":" + encodedSign
    

## ListUser 列出指定房间下当前所有用户

    
    
    Host rtc.qiniuapi.com
    GET /v3/apps/<AppID>/rooms/<RoomName>/users
    Authorization: qiniu mac
    200 OK
    {
        "users": [{
                    "userId": "<UserID>"
                }]
    }
    
    612
    {
        "error": "app not found"
    }
    

## KickUser 指定一个用户踢出房间

    
    
    Host rtc.qiniuapi.com
    DELETE /v3/apps/<AppID>/rooms/<RoomName>/users/<UserID>
    Authorization: qiniu mac
    
    200 OK
    612
    {
        "error": "app not found"
    }
    612
    {
        "error": "user not found"
    }
    615
    {
        "error": "room not active"
    }
    

## Message 向房间内用户发送消息

    
    
    Host rtc.qiniuapi.com
    POST /v3/apps/<AppID>/rooms/<RoomName>/message
    Authorization: qiniu mac
    {
        "text":"消息内容",
        "msgId":"消息ID，自行定义",
        "targets":["user1", "user2"]
    }
    
    
    ##返回值
    
    200 OK
    612
    {
        "error": "app not found"
    }
    612
    {
        "error": "user not found"
    }
    615
    {
        "error": "room not active"
    }
    

参数 | 说明  
---|---  
text | 要发送的消息题，字符串类型  
msgId | 消息ID，业务方自行定义  
targets | 列表类型，要发送给的用户名列表，为空表示发送给房间内所有人  
  
## ListActiveRoom 获取当前所有活跃的房间

    
    
    Host rtc.qiniuapi.com
    GET /v3/apps/<AppID>/rooms?prefix=<RoomNamePrefix>&offset=<Offset>&limit=<Limit>
    Authorization: qiniu mac
    200 OK
    {
        "end": <IsEnd>,
        "offset": <Offset>,
        "rooms": [
            "<RoomName>",
        ...
        ]
    }
    
    612
    {
        "error": "app not found"
    }
    

参数 | 说明  
---|---  
参数 | 说明  
AppID | 连麦房间所属的 app  
RoomName | 房间名  
RoomNamePrefix | 所查询房间名的前缀索引，可以为空。  
Offset | int 类型，分页查询的位移标记。  
Limit | int 类型，此次查询的最大长度。  
IsEnd | bool 类型，分页查询是否已经查完所有房间。  
  
## Close Room 关闭房间

用于关闭指定房间。

    
    
    Host rtc.qiniuapi.com
    DELETE /v3/apps/<AppID>/rooms/<RoomName>
    Authorization: qiniu mac
    200 OK
    
    612
    {
        "error": "app not found"
    }
    615
    {
        "error": "room not active"
    }
    

以上内容是否对您有帮助？