跳转至正文

选择器

选择器用于识别 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按指数排名的首位左撇子 Inverse3
*inverse:right/0按索引排序的首款 Inverse 系列右撇子设备
verse_grip/0按索引排序的第一款有线VerseGrip
wireless_verse_grip/*所有无线版VerseGrip
*verse_grip/*所有VerseGrip系列设备(有线、无线、定制款)
*verse_grip:custom/0按索引排序的第一个自定义 VerseGrip(custom_verse_grip/0(与……相同)

类过滤器在索引生成之前应用​

<type>:<class>/<N> 选择器首先 类过滤器应用后,对经过过滤的集合进行索引。 <N>它指的不是原始设备列表,而是经过筛选后的列表中的位置:

  • *inverse:left/0 — “左撇子”Inverse系列设备中的第0号 这是一个设备。如果连接了三个逆向设备(顺序为右手、左手、右手),则该选择器将被解释为第二个设备。索引 0这并不是先选择设备,然后再按“必须是左撇子”进行筛选的方式。
  • inverse3:right/0 — 右撇子Inverse3 中的第 0 个设备。
  • *inverse:left/3 — 如果连接的左旋 Inverse 系列设备少于四台,那么即使所有 Inverse 设备总数超过四台, 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::以...开头的第一个会话(glob 通配符)
:co.haply.hub::*:-1co.haply.hub:: 命名空间的最后一节

示例:

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

个人资料名称通配符​

配置文件模式允许使用两种 glob 元字符:

元字符含义
*与任意字符序列匹配(包括空字符串)
?与某个字符完全匹配

除上述所有字符以外(:, ., -, [, ] (包含)表示字面匹配([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 扩展。

一个例外: ? glob 元字符是 路径是 URL 查询中的分隔符。路径格式选择符(例如: /sessions/defaul?:0)中 %3F必须进行百分比编码 — GET /sessions/defaul%3F:0. 查询类型选择器(?session=defaul?:0)中的第一个 ?将查询拆分为若干部分,随后 ? 短信将原样转发,内容不会发生任何更改。

WebSocket 会话不需要选择器

在 WebSocket 连接中,用户本身就是会话。 configure 以及 commands 该项目会自动将当前会话中的设备作为目标。会话选择器 超文本传输协定 请求(包括跨会话远程控制, 会话 仅在(参考)中需要。