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 routage | Signification des sélecteurs |
|---|---|
inverse3/0 | Récupérer le premier élément à partir de l'index Inverse3(indexant à partir de 0) |
inverse3/A14 | L'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/0 | Rechercher le premier élémentde gauche selon l'indexInverse3 |
*inverse:right/0 | Récupérer le premier appareil de la série « Inverse »à droite selon l'index |
verse_grip/0 | Rechercher 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/0 | Ré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.0Filtrer à 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, renvoie404, 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 :
GETRefus des sélecteurs génériques (signification ambiguë) →400POSTetDELETEAccepte les caractères génériques — l'opération s'appliquera à tous les éléments correspondants404Réponse à l'utilisationno 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.
| expression | Signification |
|---|---|
| (omission) | Toutes les sessions (utilisables uniquement pour DELETE) |
#123 ou 123 | Session n° 123 |
:0 | Récupérer la première session à partir de l'index |
:-1 | Récupérer la dernière session à l'aide de l'index |
profile_name | Première session utilisant ce profil (il peut y avoir plusieurs interprétations possibles) |
profile_name:0 | La première session du profil spécifié dont l'index est 0 |
:default:0 | profil pour default et la première session dont l'index est 0 |
co.haply.hub::*:0 | profil avec co.haply.hub:: Première session commençant par (caractère générique « glob ») |
:co.haply.hub::*:-1 | co.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écial | Signification |
|---|---|
* | 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-updateProfil de finco.haply.*:*— Les espaces de noms commencent parco.haply.Tout profil commençant pardefaul?— au choix, par exempledefaulDé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.
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.
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).