选择器
选择器用于确定 HTTP 请求或 WebSocket 命令的目标设备及会话。
设备选择器 — URL 路径
用于所有设备级 HTTP 路由中,作为 /{device_type}/{id_or_index}/….
| 路线示例 | 选择器的含义 |
|---|---|
| inverse3/0 | FirstInverse3 索引排序(从 0 开始) |
| inverse3/A14 | Inverse3 设备 ID) A14 |
| inverse3/* | 所有Inverse3 (通配符) |
| *inverse/* | 所有 Inverse 系列设备(Inverse3、Inverse3x、Minverse) |
| inverse3:left/0 | Inverse3 索引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 或 123 | ID 为 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 连接中,你 是 本次会话 — 您的 configure 和 commands 条目会自动针对当前会话中的设备。会话选择器仅在以下情况下需要: 超文本传输协定 请求(包括跨会话的 远程控制 — 参见 会话).
