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ès | Signification du terme « sélecteur » |
|---|---|
inverse3/0 | Le premier Inverse3 spécifié par l'index (à partir de 0) |
inverse3/A14 | ID 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/0 | PremierInverse3 « gaucher »spécifié par l'index (à partir de 0) |
*inverse:right/0 | Premier périphérique de la famille « Inverse » (orientation à droite) spécifié par l'index (à partir de 0) |
verse_grip/0 | Le 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/0 | Le 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. Index0を「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,404renvoie.
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 :
GETrefuse le sélecteur de caractères génériques (en raison de son ambiguïté) →400POSTetDELETEAccepte les caractères génériques. L'opération s'applique à toutes les correspondances.404La réponse estno 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.
| Formule | Signification |
|---|---|
| (omission) | Toutes les sessions (DELETE (autorisé uniquement) |
#123 ou bien 123 | Session n° 123 |
:0 | Première session via la spécification d'index |
:-1 | Dernière session par index |
profile_name | La première session associée à ce profil (cela peut prêter à confusion) |
profile_name:0 | Après avoir spécifié le profil, la session d'index 0 |
:default:0 | Profil default Parmi les sessions, la première session, celle portant l'index 0 |
co.haply.hub::*:0 | Le nom du profil est co.haply.hub:: la première session commençant par (caractère générique « * ») |
:co.haply.hub::*:-1 | co.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éciaux | Signification |
|---|---|
* | 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—-updatetout profil se terminant parco.haply.*:*— L'espace de noms estco.haply.Tout profil commençant pardefaul?—defaulTout 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.
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.
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).