본문으로 건너뛰기

셀렉터

선택기는 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 제품군의 장치입니다. Inverse가 3대 연결된 경우(오른쪽, 왼쪽, 오른쪽 순서), 이 장치는 두 번째 장치로 인식됩니다. 인덱스 0 “left여야 한다”는 조건으로 필터링한 결과를 가리키는 것은 아닙니다.
  • inverse3:right/0 — 0번째 오른손잡이Inverse3입니다.
  • *inverse:left/3 — 연결된 왼손잡이 Inverse가 4대 미만인 경우, Inverse의 총 대수가 4대를 초과하더라도 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::*:-1co.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 로 시작하는 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 인코딩을 할 필요는 없습니다. 셸에서는,# や * 해당 토큰을 따옴표로 묶어 주세요(예: --session "#42"、--session "co.haply.hub::*:0"). 그렇지 않으면 셸이 이를 주석으로 처리하거나 로컬 파일에 대해 글로브 확장을 수행할 수 있습니다.

한 가지 예외가 있습니다: ? 'grob'의 메타문자는,패스에서는 URL 쿼리의 구분자입니다. 경로 형식의 선택자(예: /sessions/defaul?:0)에서는,%3F 로 퍼센트 인코딩해야 합니다(예: GET /sessions/defaul%3F:0). 쿼리 형식의 선택자(?session=defaul?:0)에서는, 첫 번째 ? 만이 쿼리를 분할하고, 그 이후의 ? 문자는 그대로 전달됩니다.

WebSocket 세션에는 선택자가 필요하지 않습니다.

WebSocket 연결에서는 연결 자체가세션가 됩니다.configure 그리고 commands 해당 항목은 현재 세션의 장치를 자동으로 대상으로 합니다. 세션 선택기가 필요한 경우는,HTTP 요청만 가능합니다(세션 간 원격 조작 포함). 자세한 내용은 세션 (참조).