Aller au contenu principal

Sélecteur

Les sélecteurs servent à identifierle périphériqueet la sessioncibles d'une requête HTTP ou d'une commande WebSocket.

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

À utiliser pour tout le routage HTTP au niveau des périphériques, au format /{device_type}/{id_or_index}/…。

Exemple de routageSignification des sélecteurs
inverse3/0Récupérer le premier élément à partir de l'index Inverse3(indexant à partir de 0)
inverse3/A14L'identifiant de l'appareil est A14 le Inverse3
inverse3/*Tous les appareils Inverse3 (caractère générique)
*inverse/*Tous les appareils de la gamme Inverse (Inverse3, Inverse3x,Minverse)
inverse3:left/0Rechercher le premier élémentde gauche selon l'indexInverse3
*inverse:right/0Récupérer le premier appareil de la série « Inverse »à droite selon l'index
verse_grip/0Rechercher le premier VerseGrip filaire dans l'index
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/0Récupérer le premier VerseGrip personnalisé à partir de l'index (ce qui revient à custom_verse_grip/0)

Les filtres de classe sont analysés avant les index​

<type>:<class>/<N> Le sélecteur vaD'abordAppliquer un filtre, puis indexer l'ensemble filtré.<N> Il s'agit de la position dans la liste après filtrage, et non de celle dans la liste initiale des appareils :

  • *inverse:left/0 — La main gauche n° 0 Appareils de la série Inverse. Si trois appareils Inverse sont connectés (droite, gauche, droite), le système identifie le deuxième appareil, plutôt que l'index de la liste d'origine. 0 Filtrer à nouveau en sélectionnant « Doit être gaucher ».
  • inverse3:right/0 — La main droite n° 0 Inverse3。
  • *inverse:left/3 — Si le nombre d'appareils « Inverse » connectés du côté gauche est inférieur à quatre, renvoie 404, même si le nombre total d'appareils Inverse dans le système dépasse quatre.

Les sélecteurs utilisant des caractères génériques suivent également cette règle :*inverse/* et *verse_grip/* qui correspondront à cette sérieChacunÉquipements, pour ces sélecteurs POST / DELETE La requête appliquera l'opération àChacunles résultats correspondants, et pas seulement le premier.

Règles :

  • GET Refus des sélecteurs génériques (signification ambiguë) → 400
  • POST et DELETE Accepte les caractères génériques — l'opération s'appliquera à tous les éléments correspondants
  • 404 Réponse à l'utilisation no device matches selector '<sel>' au format, dans lequel <sel> Pour l'expression de sélecteur d'origine reçue

Prise en charge de {device_type} Valeur : inverse3,verse_grip,wireless_verse_grip, ou un caractère générique de série *inverse,*verse_grip。

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

Les points de terminaison HTTP au niveau de la session (basis, mount, preset, filters, navigation, SDF) nécessitent ?session=<expr> Paramètre de requête permettant de spécifier le contexte de session dans lequel s'effectue l'opération.

expressionSignification
(omission)Toutes les sessions (utilisables uniquement pour DELETE)
#123 ou 123Session n° 123
:0Récupérer la première session à partir de l'index
:-1Récupérer la dernière session à l'aide de l'index
profile_namePremière session utilisant ce profil (il peut y avoir plusieurs interprétations possibles)
profile_name:0La première session du profil spécifié dont l'index est 0
:default:0profil pour default et la première session dont l'index est 0
co.haply.hub::*:0profil avec co.haply.hub:: Première session commençant par (caractère générique « glob »)
:co.haply.hub::*:-1co.haply.hub:: La dernière session dans l'espace de noms

Exemple :

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

Profil : caractères génériques de nom​

Le mode « profile » prend en charge deux caractères génériques « glob » :

Caractère spécialSignification
*Correspond à n'importe quelle séquence de caractères (y compris une séquence vide)
?correspond exactement à un caractère

Tous les autres caractères — y compris :,.,-,[,]——Toutes les correspondances sont littérales (NonPrend en charge les classes de caractères, telles que [abc]). La correspondance tient compte de la casse.

séparé *(ou all) conserve son sens d'origine, à savoirToutes les sessions。Pour rechercher des noms commençant par * Au début de votre profil, veuillez inclure au moins un autre caractère (par exemple *foo).

Modes courants :

  • co.haply.hub::* — co.haply.hub:: Tout profil de l'espace de noms
  • *-update — au choix, par exemple -update Profil de fin
  • co.haply.*:* — Les espaces de noms commencent par co.haply. Tout profil commençant par
  • defaul? — au choix, par exemple defaul Début du profil : 7 caractères au total

Les modèles de caractères génériques en eux-mêmesIl y a un ambiguïté(peut correspondre à plusieurs sessions). Pour GET / POST Pour une utilisation sur un terminal, veuillez ajouter à la fin :<index> Afin d'éviter 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 seront, dans les requêtes GET/POST, 400 Refusé. Son utilisation est toutefois autorisée sur les routes acceptant explicitement la correspondance multisession —GET /sessions/<sel>(Afficher tous les résultats) et DELETE Termes (applicables à tous les résultats correspondants).

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

/sessions/{selector} Les points d'extrémité acceptent etExpressions ayant les mêmes paramètres de chemin——Permet de rechercher une session spécifique ou de vérifier si elle 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

Cela revient, d'un point de vue fonctionnel, à GET /sessions?session=<selector>; ces deux routes font appel à la même fonction de traitement.GET /sessions/<sel> C'est l'un des rares cas où l'on peut omettre :<index> Suffixe, l'un des points de terminaison acceptant les motifs génériques ambigus — il se comporte de la même manière que GET /sessions La même structure de liste renvoie tous les éléments correspondants.

Sélecteur de transmission « tel quel »

Toutes les formes de sélecteurs mentionnées ci-dessus — y compris #42 ainsi que les * Le mode « profile » — sera toujours utilisé par un client HTTP standard (Python requests, libhv, curl,fetch) Transmettez-la telle quelle. Il n'est pas nécessaire de procéder à un encodage d'URL côté client. Dans le shell, veuillez traiter les éléments contenant # ou * Mettez les paramètres entre guillemets (par exemple --session "#42",--session "co.haply.hub::*:0"), afin d'éviter que le shell ne le considère comme un commentaire ou n'effectue une expansion « glob » sur les fichiers locaux.

Une exception: àChemin d'accèsparmi lesquels,? Le caractère « glob » sert de séparateur dans les requêtes URL. Dans les sélecteurs de type « chemin » (par exemple /sessions/defaul?:0), il doit être codé sous la forme %3F, c'est-à-dire GET /sessions/defaul%3F:0. Le sélecteur de forme de requête (?session=defaul?:0), seul le premier ? La partie consacrée aux requêtes sera séparée ; la suite… ? Les caractères seront transmis tels quels.

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

Dans une connexion WebSocket, vousC'est-à-direLa conversation elle-même — la tienne configure et commands L'entrée redirigera automatiquement vers l'appareil de la session en cours. Seul HTTP Le sélecteur de session n'est nécessaire que lors d'une requête (y compris pour le contrôle à distance entre sessions ; voir Conversation).