Passer directement au contenu principal

Sélecteur

Le sélecteur permet de désignerles appareilsetles sessions quiferont l'objet d'une requête HTTP ou d'une commande WebSocket.

Sélecteur de périphériques — Chemin d'accès URL​

Pour toutes les routes HTTP au niveau des périphériques,/{device_type}/{id_or_index}/… Il est utilisé sous cette forme.

Exemples de chemins d'accèsSignification du terme « sélecteur »
inverse3/0Le premier Inverse3 spécifié par l'index (à partir de 0)
inverse3/A14ID de l'appareil A14 Inverse3
inverse3/*Tous les appareils Inverse3 (caractère générique)
*inverse/*Tous les appareils de la gamme Inverse (Inverse3, Inverse3x,Minverse)
inverse3:left/0PremierInverse3 « gaucher »spécifié par l'index (à partir de 0)
*inverse:right/0Premier périphérique de la famille « Inverse » (orientation à droite) spécifié par l'index (à partir de 0)
verse_grip/0Le premier VerseGrip filaire spécifié par l'index (à partir de 0)
wireless_verse_grip/*Tous les VerseGrip sans fil
*verse_grip/*Tous les appareils de la gamme VerseGrip (avec fil, sans fil, sur mesure)
*verse_grip:custom/0Le premier VerseGrip personnalisé spécifié par l'index (à partir de 0) (custom_verse_grip/0 (idem)

Résoudre les filtres de classe avant l'indexation​

<type>:<class>/<N> Le sélecteur de format commence parFiltre de classesOn applique cette opération, puis on indexe l'ensemble obtenu après filtrage.<N> Il ne s'agit pas de la liste des périphériques bruts, mais de leur position dans la liste après application des filtres :

  • *inverse:left/0 — Le gaucher n° 0Il s'agit d'un appareil de la gamme Inverse. Lorsque trois appareils Inverse sont connectés (dans l'ordre : droit, gauche, droit), celui-ci est identifié comme le deuxième appareil. Index 0 を「left である必要がある」でフィルターした結果を指すわけではありません。
  • inverse3:right/0 — Le droitier n° 0C'est Inverse3.
  • *inverse:left/3 — Si le nombre d'Inverse gauchers connectés est inférieur à 4, même si le nombre total d'Inverse dépasse 4, 404 renvoie.

La même règle s'applique au sélecteur de caractères génériques.*inverse/* et *verse_grip/* Au sein de la familleTous lesqui correspondent à l'appareil et ciblent ces sélecteurs POST et DELETE La requête applique l'opération non seulement au premier appareil, mais aussi à tous les appareils correspondants.

Règles :

  • GET refuse le sélecteur de caractères génériques (en raison de son ambiguïté) → 400
  • POST et DELETE Accepte les caractères génériques. L'opération s'applique à toutes les correspondances.
  • 404 La réponse est no device matches selector '<sel>' On utilise le format suivant.<sel> Il s'agit de l'expression de sélecteur d'origine reçue.

correspondant à {device_type} Valeur : inverse3,verse_grip,wireless_verse_gripou un caractère générique de famille *inverse,*verse_grip。

Sélecteur de session — ?session=<expr> Paramètres de requête​

Dans les points de terminaison HTTP de la portée de session (basis, mount, preset, filters, navigation, SDF), afin d'identifier le contexte de la session concernée par l'opération, ?session=<expr> Des paramètres de requête sont requis.

FormuleSignification
(omission)Toutes les sessions (DELETE (autorisé uniquement)
#123 ou bien 123Session n° 123
:0Première session via la spécification d'index
:-1Dernière session par index
profile_nameLa première session associée à ce profil (cela peut prêter à confusion)
profile_name:0Après avoir spécifié le profil, la session d'index 0
:default:0Profil default Parmi les sessions, la première session, celle portant l'index 0
co.haply.hub::*:0Le nom du profil est co.haply.hub:: la première session commençant par (caractère générique « * »)
:co.haply.hub::*:-1co.haply.hub:: Dernière session dans l'espace de noms

Exemple :

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

Caractères génériques dans les noms de profil​

Dans les modèles de profil, vous pouvez utiliser deux types de métacaractères de glob :

caractères spéciauxSignification
*Correspond à une chaîne de caractères de longueur quelconque, y compris une chaîne vide
?Correspond exactement à un caractère

Tous les caractères autres que ceux mentionnés ci-dessus (:,.,-,[,] (y compris) correspond en tant que littéral ([abc] Les classes de caractères telles queNon pris en charge). Il faut respecter la casse.

unique *(ou all) reste inchangéToutes les sessionssignifie. Le nom * Pour correspondre à un profil commençant par ce caractère, veuillez inclure au moins un autre caractère (exemple : *foo).

Modèles couramment utilisés :

  • co.haply.hub::* — co.haply.hub:: Tout profil au sein d'un espace de noms
  • *-update — -update tout profil se terminant par
  • co.haply.*:* — L'espace de noms est co.haply. Tout profil commençant par
  • defaul? — defaul Tout profil de 7 caractères commençant par

Les motifs avec caractères génériques, pris isolément,Ambiguïté(Il se peut que plusieurs sessions correspondent).GET / POST Pour l'utiliser sur un terminal, ajoutez à la fin :<index> Veuillez ajouter [ ] pour lever toute ambiguïté :

# 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

Les caractères génériques ambigus (sans index) sont, dans les requêtes GET/POST, 400 sont rejetées. Elles sont toutefois autorisées dans les routes qui acceptent explicitement les correspondances sur plusieurs sessions. Plus précisément,GET /sessions/<sel>(renvoie tous les éléments correspondants), etDELETE Il s'agit d'un point de terminaison (applicable à toutes les correspondances).

Sélecteur de session — Chemin d'accès URL​

/sessions/{selector} Les points de terminaison sont :La même formule que celle des paramètres de passageest pris en charge. Cela s'avère pratique pour rechercher une session spécifique ou vérifier si celle-ci existe :

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

D'un point de vue fonctionnel, cela GET /sessions?session=<selector> C'est équivalent. Les deux chemins appellent le même gestionnaire.GET /sessions/<sel> est,:<index> C'est l'un des rares points de terminaison à autoriser les modèles génériques ambigus sans suffixe.GET /sessions Elle utilise une structure de wrapper au format de liste identique et renvoie tous les éléments correspondants.

Le sélecteur est transmis tel quel

Tous les formats de sélecteurs mentionnés ci-dessus (#42 や * (y compris les modèles de profil) sont pris en charge par un client HTTP standard (Python requests, libhv, curl,fetch) est transmise telle quelle. Aucun encodage d'URL n'est nécessaire côté client. Dans le shell,# や * Veuillez mettre les tokens contenant ces éléments entre guillemets (exemple : --session "#42",--session "co.haply.hub::*:0"). Sinon, le shell les traitera comme des commentaires ou effectuera une expansion de glob sur les fichiers locaux.

Il y a une exception.: ? Les caractères génériques de « grob » sont :PasseIl s'agit du séparateur des paramètres de requête dans une URL. Les sélecteurs au format « chemin » (par exemple : /sessions/defaul?:0) où,%3F Il faut l'encoder en pourcentage (par exemple : GET /sessions/defaul%3F:0). Sélecteur sous forme de requête (?session=defaul?:0) Dans ce cas, le premier ? C'est le seul élément qui divise la requête, et les éléments suivants ? Le texte est transmis tel quel.

Les sessions WebSocket ne nécessitent pas de sélecteur.

Dans le cas d'une connexion WebSocket, la connexion elle-mêmeSessionCela donne.configure et commands Les entrées s'appliquent automatiquement aux appareils de la session en cours. Un sélecteur de session est nécessaire lorsque :HTTP Il s'agit uniquement de requêtes (y compris les opérations à distance s'étendant sur plusieurs sessions). Pour plus de détails, Session (voir ci-dessous).