支持中心/SDK 与 API 文档

选择器

选择器用于确定 HTTP 请求或 WebSocket 命令的目标设备及会话。

设备选择器 — URL 路径

用于所有设备级 HTTP 路由中,作为 /{device_type}/{id_or_index}/….

路线示例选择器的含义
inverse3/0FirstInverse3 索引排序(从 0 开始)
inverse3/A14Inverse3 设备 ID) A14
inverse3/*所有Inverse3 (通配符)
*inverse/*所有 Inverse 系列设备(Inverse3、Inverse3x、Minverse)
inverse3:left/0Inverse3 索引Inverse3 第一个左侧 Inverse3
*inverse:right/0按索引排序的首款右旋Inverse系列设备
verse_grip/0首款带线VerseGrip(按索引排序)
wireless_verse_grip/*全无线 VerseGrips
*verse_grip/*所有VerseGrip系列设备(有线、无线、定制)
*verse_grip:custom/0首个按索引排序的自定义 VerseGrip(与 custom_verse_grip/0)

类过滤器在索引之前就已解析完毕

A <type>:<class>/<N> 选择器应用类过滤器 第一, 然后将索引添加到已过滤的集合中。该 <N> 指的是过滤后列表中的位置,而不是 原始设备列表:

  • *inverse:left/0 — 该 第0个左撇子 反向系列设备。如果将三个 反向设备连接起来(右、左、右),则会解析为第二个 设备——而不是索引 0 筛选为“必须是左侧”。
  • inverse3:right/0 — 第0阶右旋Inverse3。
  • *inverse:left/3 — 404 如果连接的左逆元少于四个, 即使总共存在四个以上的左逆元。

该规则同样适用于通配符选择器: *inverse/* 和 *verse_grip/* 匹配 每个 该系列中的设备,以及 POST / DELETE 针对以下目标的请求: 这些选择器将操作应用于 每个 匹配——不仅仅是第一个 。

规则:

  • GET 不接受通配符选择器(存在歧义)→ 400
  • POST 和 DELETE 接受通配符 — 该操作将应用于所有匹配项
  • 404 回复请采用以下格式 no device matches selector '<sel>', 其中 <sel> 是收到的原始选择器表达式

支持 {device_type} 值: inverse3, verse_grip, wireless_verse_grip, 或家族通配符 *inverse, *verse_grip.

会话选择器 — ?session=<expr> 查询参数

会话作用域的 HTTP 端点(basis、mount、preset、filters、navigation、SDF) 需要一个 ?session=<expr> 查询参数,用于确定在哪个会话上下文中进行操作。表达

表达含义
*所有会话(允许在 DELETE (仅限)
#123 或 123ID 为 123 的会话
:0按索引排列的第一节
:-1按索引查看上一节
profile_name首次使用此配置文件(可能存在歧义)
profile_name:0首次会话,包含个人资料 + 索引 0
:default:0首次会话(使用个人资料) default 在索引 0 处
co.haply.hub::*:0第一个会话的简介以 co.haply.hub:: (通配符)
:co.haply.hub::*:-1上一节在 co.haply.hub:: 命名空间

示例:

                
GET /inverse3/0/config/navigation?session=:default:0
        
              

配置文件名称通配符

配置文件模式支持两种通配符:

元字符含义
*匹配任何字符序列(包括空字符串)
?匹配一个字符

其他所有角色——包括 :, ., -, [, ] — 进行字面匹配(字符类,例如 [abc] 是 不 (受支持)。匹配操作区分大小写。

一个光秃秃的 * (或 all) 保留其原有的含义,即 所有会议. 匹配名称以 开头的个人资料 *,请包含至少一个其他字符(例如 *foo).

常用模式:

  • co.haply.hub::* — 该列表中的任何个人资料 co.haply.hub:: 命名空间
  • *-update — 任何以 -update
  • co.haply.*:* — 任何命名空间以 co.haply.
  • defaul? — 任何以 defaul

通配符模式是 模棱两可 单独使用(它可以匹配多个会话)。要在...上使用它: a GET / POST 端点,通过尾部内容消除歧义 :<index>:

                
# First session in the Haply Hub namespace
GET /inverse3/0/config/basis?session=co.haply.hub::*:0

# Last session in a Unity namespace
GET /inverse3/0/config/mount?session=:co.haply.unity::*:-1
        
              

含糊通配符(无索引)将被拒绝,具体表现为 400 在 GET/POST 请求中。在明确支持多会话匹配的路由上,这些请求会被允许—— GET /sessions/<sel> (返回所有匹配项)以及 DELETE 端点(应用于每次匹配)。

会话选择器 — URL 路径

"(《世界人权宣言》) /sessions/{selector} 端点接受 与路径相同的表达式 参数 — 适用于查询单个会话或验证其是否存在:

                
GET /sessions                      # list all active sessions
GET /sessions/:default:0           # one session by profile + index
GET /sessions/:-1                  # last active session
GET /sessions/#42                  # session id 42
GET /sessions/co.haply.hub::*      # every session in the co.haply.hub:: namespace
GET /sessions/co.haply.hub::*:0    # first session in that namespace
        
              

这在功能上等同于 GET /sessions?session=<selector>; 这两条路由都调用了同一个处理程序。 GET /sessions/<sel> 是少数几个端点之一, 它允许使用没有 的模糊通配符模式 :<index> 后缀 — it 将所有匹配项返回至与 GET /sessions.

原样传递选择器

原样传递选择器上述所有选择器表单——包括 #42 以及轮廓图案,使用 * — 由标准 HTTP 客户端原样传输(Python requests, libhv, curl, fetch). 无需进行客户端 URL 编码。在 Shell 中,请对包含 的令牌进行转义 # 或 * (例如: --session "#42", --session "co.haply.hub::*:0") 以防止 shell 将其视为注释或对其进行通配符展开 针对本地文件。一个例外:该 ? glob 通配符是 URL 查询分隔符 在 路径. 在路径形式的选择器中(例如 /sessions/defaul?:0) 必须以百分比编码的形式表示为 %3F — GET /sessions/defaul%3F:0. 在查询式中: 选择器 (?session=defaul?:0),仅限第一行 ? 将查询拆分为两部分,并 ? 字符将原样传递。

WebSocket 会话不需要选择器

在 WebSocket 连接中,你 是 本次会话 — 您的 configure 和 commands 条目会自动针对当前会话中的设备。会话选择器仅在以下情况下需要: 超文本传输协定 请求(包括跨会话的 远程控制 — 参见 会话).