选择器
选择器用于指定哪些设备和哪些会话作为HTTP 请求或 WebSocket 命令的目标。
设备选择器 — URL 路径
在所有设备级别的HTTP路由中,/{device_type}/{id_or_index}/… 以……的形式使用。
| 路径示例 | 选择器的含义 |
|---|---|
inverse3/0 | 索引(从0开始)指定的第一个Inverse3 |
inverse3/A14 | 设备 ID A14 Inverse3 |
inverse3/* | 所有 Inverse3 设备(通配符) |
*inverse/* | Inverse 系列的所有设备(Inverse3、Inverse3x、Minverse) |
inverse3:left/0 | 以索引(从0开始)指定的第一个左侧Inverse3 |
*inverse:right/0 | 索引(从 0 开始)指定的第一个右对齐的Inverse 字体家族设备 |
verse_grip/0 | 索引(从0开始)中指定的第一个有线VerseGrip |
wireless_verse_grip/* | 所有无线版 VerseGrip |
*verse_grip/* | VerseGrip 系列的所有设备(有线、无线、定制) |
*verse_grip:custom/0 | 通过索引(从0开始)指定的第一个自定义VerseGrip(custom_verse_grip/0 (与……相同) |
在建立索引之前解决类过滤器问题
<type>:<class>/<N> 样式选择器首先类过滤器应用该操作,随后对过滤后的集合进行索引。<N> 指的是经过过滤后的列表中的位置,而非原始设备列表中的位置:
*inverse:left/0— 第0号左撇子这是 Inverse 系列的一款设备。当连接了 3 台 Inverse 设备时(顺序为右、左、右),该设备将被识别为第二台设备。索引0を「left である必要がある」でフィルターした結果を指すわけではありません。inverse3:right/0— 第0号右撇子这是Inverse3。*inverse:left/3— 如果已连接的左旋 Inverse 设备少于 4 台,即使 Inverse 设备总数超过 4 台,404返回。
该规则同样适用于通配符选择器。*inverse/* 和 *verse_grip/* 是该家族中的所有与设备匹配,并针对这些选择器 POST 以及 DELETE 该请求不仅会对第一台设备,还会对所有匹配的设备应用该操作。
规则:
GET会拒绝通配符选择器(因其含义不明确)→400POST和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:: 以...开头的第一个会话(Glob 通配符) |
:co.haply.hub::*:-1 | co.haply.hub:: 命名空间中的最后一个会话 |
例:
GET /inverse3/0/config/navigation?session=:default:0
配置文件名的通配符
在配置文件模式中,可以使用两种类型的 glob 元字符:
| 元字符 | 含义 |
|---|---|
* | 匹配包含空字符串的任意长度字符串 |
? | 正好匹配1个字符 |
除上述以外的所有字符(:、.、-、[、] (包括)作为字面量进行匹配([abc] 诸如这样的字符类是不支持)。区分大小写。
单独的 *(或 all)仍按惯例所有会议的意思是。名字是 * 要与以该字符开头的配置文件匹配,请再包含至少一个字符(例如: *foo)。
常用模式:
co.haply.hub::*—co.haply.hub::命名空间内的任意配置文件*-update—-update以...结尾的任意配置文件co.haply.*:*— 命名空间为co.haply.以...开头的任意配置文件defaul?—defaul以...开头的任意7个字符的个人资料
通配符模式单独使用时暧昧(可能与多个会话匹配)。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
在 GET/POST 请求中,模糊通配符(无索引)是 400 将被拒绝。在明确允许匹配多个会话的路由中,这些情况是被允许的。具体来说,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> 这是少数几个允许使用不带“的”后缀的模糊通配符模式的端点之一。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 该条目会自动针对当前会话中的设备。需要会话选择器的情况是,超文本传输协定 仅限请求(包括跨会话的远程操作。详情请参见 会话 请参阅()。