Services Web pris en charge

SOAP

Le langage Snippet (extrait de code) prend en charge les services Web basés sur SOAP via le processus de génération d'un serveur mandataire (proxy). Studio doit être utilisé pour générer le proxy qui est ensuite enregistré en tant que DLL .NET dans le système de fichiers CXone. Tous les serveurs mandataires (proxies) de service Web doivent être enregistrés dans le dossier racine de l'unité commerciale qui l'utilisera. Il est possible pour un administrateur système de créer un serveur mandataire (proxy) sous l'unité commerciale 3 pour une utilisation partagée, bien que cela n'ait pas encore été fait en production.

Les services Web basés sur SOAP sont en déclin car les services Web RESTful prennent leur place. Notre processus de génération de serveur mandataire (proxy)de service Web SOAP est susceptible d'être interrompu à un moment donné. Aucune nouvelle amélioration n'est prévue dans un avenir prévisible.

Dans le processus de génération de serveur mandataire (proxy), certaines capacités sont ajoutées à l'objet serveur mandataire (proxy) afin qu'il fonctionne bien avec CXone. Une telle capacité supplémentaire est la possibilité de sérialiser en un flux binaire. Tous les types, y compris le serveur mandataire (proxy), doivent être en mesure de sérialiser pour que la redondance VC et la capacité de conversion de paramètres (marshaling) de script fonctionnent. Le processus de génération de serveur mandataire (proxy) Studio est donc requis.

Outre la capacité de sérialisation, le serveur mandataire (proxy) est également configuré de sorte que le moteur d'exécution VC utilise correctement le pool de threads en attendant la fin d'un appel de service Web. Sans cette capacité, le groupe (pool) de fils (threads) VC ne sera pas utilisé correctement et, par conséquent, les clients peuvent être affectés négativement. Il est essentiel d'utiliser le groupe (pool) de fils (threads) approprié.

La capacité finale ajoutée par le processus Studio est la capacité de suivre l'utilisation des services Web. Comme le serveur mandataire (proxy) est appelé pour effectuer des appels externes de service Web, des compteurs et des suiveurs de temps sont utilisés pour enregistrer l'utilisation et l'impact. Ces indicateurs sont enregistrés plusieurs fois au cours de la journée dans une table de base de données à des fins administratives.

Les usages

Dans un Snippet (extrait de code), la commande USES permet à un extrait de code d'inclure une DLL de serveur mandataire (proxy) de service Web à utiliser dans l'extrait de code. Le fichier DLL doit se trouver soit dans le dossier racine de l'unité commerciale actuelle sur le serveur de fichiers, soit dans le dossier racine de l'unité commerciale 3 (pour une utilisation partagée). Syntaxe :

USES "<proxy>.dll" 

Exemples:

USES "sf.dll" cStart="{now}" sforce=new SforceService() session=new SessionHeader() loginResult=sforce.login("demo@ucn.net",password6") sforce.sessionheadervalue=session session.sessionid=loginResult.sessionid sforce.url=loginresult.serverUrl t=new Task() t.ActivityDate=#"8/20/2050" t.Description="Appel passé par {first }{Last}." t.Subject="Appel @{cStart}" t.Status="Terminé" t.CallType="Sortant" t.OwnerId=SF_Agent_ID t.ReminderDateTime="{cStart}" SWITCH Type { CASE "CON" { t.WhoId=SF_Obj_ID } CASE "LEA" { t.WhoId=SF_Obj_ID } CASE "ACC" { t.WhatId=SF_Obj_ID } CASE "OPP" { t.WhatId=SF_Obj_ID } CASE "CAS" { t.WhatId=SF_Obj_ID } } SaveResult=sforce.create(t) 

REMARQUE : Avant d'utiliser une DLL serveur mandataire (proxy) de service Web sur la plateforme (en dehors des tests Studio), elle doit être autorisée. Le processus d'autorisation consiste aujourd'hui à ajouter le nom de la DLL à un fichier texte d'autorisation situé sur le serveur COR (où s'exécute le VC). Utilisez la page Résumé de l'administrateur Web et vérifiez le paramètre de configuration AuthorizedAssemblies pour vérifier l'emplacement. Le format de l'entrée est BUS<busno>\<proxy>.dll. Par exemple : BUS4\LCWS.dll. Chaque DLL distincte doit se trouver sur une nouvelle ligne. Si une DLL est mise à jour après avoir été utilisée dans un script, la seule façon d'obtenir la DLL mise à jour à utiliser est de redémarrer le VC.

Reposant

Le langage Snippet fonctionne avec les services Web RESTful via quelques services intégrés. Le premier est le service RestProxy qui peut être utilisé en créant une nouvelle instance de cette manière:

proxy = GetRESTProxy() 

RestProxy fournit une poignée de propriétés et de méthodes pour interagir avec des serveurs Web distants. La méthode clé pour effectuer une demande est appelée MakeRestRequest. Une description complète de toutes les propriétés et méthodes sera fournie ci-dessous. Lors de l'échange d'informations avec un service Web RESTful, RestProxy prend en charge un format de définition de données structurées dynamiques appelé type DynamicData. Le type DynamicData peut recevoir des données au format XML et JSON et fournir des modèles d'accès orientés objet pour lire les données. Il peut également permettre la génération dynamique d'un objet qui peut être converti en XML ou JSON.

Pour créer un nouvel objet DynamicData, utilisez la commande DYNAMIC :

DYNAMIC <nom> [FROM'<chaîne>' | <var>] 

Le <nom> est le nom d'une nouvelle variable de script et doit être compatible avec la spécification de script inControl (pas de chiffres ou de caractères spéciaux à l'exception du trait de soulignement '_', se terminant éventuellement par un signe dollar '$'). Si la clause FROM facultative est utilisée, le texte peut être une chaîne JSON ou XML explicite (entre guillemets simples) ou le nom d'une variable de script contenant JSON ou XML. L'initialisation est fournie pour simplifier les tests uniquement et n'est pas fournie comme moyen général d'initialisation des variables dynamiques. Une seule ligne de texte est autorisée. Si un saut de ligne est rencontré avant le guillemet simple de clôture, une erreur est générée.

Membres et sous-membres

Les variables dynamiques dans ce langage sont des entités spécialement conçues qui ont un large éventail de capacités utiles. En surface, ce sont des objets qui peuvent avoir des membres créés dynamiquement. Par exemple, dans un extrait de code, une variable dynamique peut être déclarée et plusieurs membres créés:

DYNAMIC employee employee.Name = "John Smith" employee.Phone = "8005551212" employee.Address = "1234 Clay Street 

Au fur et à mesure que chaque membre est adressé, il est automatiquement créé. Ainsi, les membres Nom, Téléphone et Adresse agiront désormais comme propriétés de la variable employé.

Les membres de variables dynamiques sont sensibles à la casse. Donc employee.Name n'est pas la même chose que employee.name. Ceci est différent du comportement normal de la plateforme CXone. Cependant, en raison de la nécessité d'interopérer avec des systèmes externes - dont la plupart dépendent d'un cas correct - cette décision a été prise et ne s'applique qu'aux variables dynamiques.

Les sous-membres peuvent également être créés à la volée :

employee.Department.Code = 942 employee.Department.Location = "Olive City" 

Encore une fois, comme les sous-membres sont adressés, ils sont automatiquement ajoutés à la structure. Désormais avec une seule expression, une référence à la structure peut être affectée à une autre variable de script dynamique:

John = employee 

Un point important à reconnaître est que « employee » et « John » feront référence aux mêmes données physiques. Si vous changez un membre d'un, vous changerez les deux. Pour copier des données, utilisez la fonction de copie intégrée. L'exemple Snippet suivant le montre :

DYNAMIC x x.Name = "John" y = x y.Name = "Sam" 

Le résultat est indiqué ci-dessous :

Exemple de fonction de copie intégrée.

Avec la fonction de copie, y obtient une copie unique et peut la modifier sans affecter x :

DYNAMIC x x.Name = "John" y = copy(x) y.Name = "Sam" 

Image affichant un exemple de fonction de copie.

Vous pouvez également copier des membres enfants :

DYNAMIC x x.Name.First = "John" x.Name.Last = "Smith" y = copy(x.Name) y.First = "Sam" 

Image montrant un exemple de membres enfants.

Concernant la fonction de copie: elle effectue une copie complète en convertissant l'objet en une représentation textuelle, puis de nouveau en un objet. Cela coûte plus cher sur les ressources de la plate-forme que de simplement copier une référence. De très gros objets pourraient générer beaucoup de surcharge et potentiellement ralentir l'exécution des scripts. Utilisez-le si nécessaire, mais essayez de ne pas en abuser.

Les variables dynamiques peuvent également gérer des tableaux. Soit l'objet lui-même peut être traité comme un tableau de niveau supérieur, soit un membre peut être traité comme un tableau:

DYNAMIC employees employees[1] = john or employees.Person[1] = john 

Important !! Tous les tableaux commencent à l'index 1. Si vous référencez un index de tableau qui n'existe pas encore, il le créera. Si les éléments sous l'index nouvellement référencé n'existent pas, ils seront également créés. Par conséquent, méfiez-vous, car la spécification accidentelle de l'index 100 créera des éléments vides pour les index 1 à 99. Pour obtenir le nombre d'éléments dans un tableau, utilisez la fonction count (): x = count (salariés.Personne).

Here is the Inspector tab in Studio’s Snippet property editor. Il montre une variable dynamique avec un tableau de niveau supérieur:

Image affichant une variable dynamique avec un tableau de niveau supérieur.

En déplaçant les éléments dans un membre enfant nommé Name, voici à quoi il ressemble:

Image affichant des exemples d'éléments enfants.

Il existe une différence entre une variable dynamique qui est un tableau de niveau supérieur et une variable de script standard qui est un tableau de variables dynamiques. L'exemple suivant illustre cela:

DYNAMIC a DYNAMIC b DYNAMIC c a.Name = "John" b.Name = "Sam" c.Name = "Arnold" x[1] = a x[2] = b x[3] = c DYNAMIC y y[1] = a y[2] = b y[3] = c 

Les 2 variables à examiner sont x et y. La première, x, est une variable de script normale contenant un tableau de variables dynamiques. La seconde, y, est une variable dynamique qui est un tableau de niveau supérieur. Les deux se ressemblent dans l'inspecteur:

Image affichant un exemple de variable dynamique.

Bien qu'ils se ressemblent, ils ne sont pas identiques. La section suivante traite du concept de sérialisation des variables dynamiques. Le point important est que dans l'exemple ci-dessus, X ne peut pas être utilisé pour interagir avec un système distant de la même manière que Y le peut. X n'est pas sérialisable, Y l'est.

Sérialisation

Avant de discuter de la sérialisation, il serait utile de montrer comment interagir avec les variables dynamiques par rapport aux variables de script normales. Les variables normales ont une longue liste de méthodes intégrées pour permettre des choses comme l'analyse de chaînes, la conversion en une date, le tri, etc. Cliquez sur la liste déroulante suivante pour afficher de nombreux exemples d'interaction avec des variables dynamiques.

L'un des avantages de l'utilisation de variables dynamiques est la puissance de la sérialisation. Il s'agit de la possibilité de convertir l'objet en un format textuel adapté à la transmission sur le Web. 2 formats sont actuellement pris en charge: XML et JSON. Si vous utilisez RestProxy (discuté plus haut dans cette section), le processus de sérialisation se fera automatiquement. Si vous devez générer la chaîne sérialisée manuellement, deux méthodes de chaîne sont proposées:

<var>.asjson() <var>.asxml() 

Utilisez dans un contexte de chaîne pour générer la version sérialisée de l'objet :

text = "{y.asjson()}" 

Voici ce que le texte peut contenir en supposant que la valeur de y ressemble à l'exemple précédent :

{"Name":[{"First":"Sam","Last":"Smith"},{"First":"Bill","Last":"Smith"}]} 

De même, la méthode .asxml produit une sortie comme celle-ci :

<?xml version="1.0" encoding="utf-16" standalone="yes"?> <DynamicDataObject><Name><First>Sam</First<Last>Smith</Last></Name> <Name><First>Bill</First><Last>Smith</Last></Name></DynamicDataObject> 

Membres RestProxy

Le RestProxy, obtenu en appelant GetRestProxy (), fournit les services pour communiquer avec un serveur Web distant à l'aide des conventions de service Web RESTful. Lorsque vous utilisez l'éditeur d'extraits de studio, les propriétés et méthodes disponibles peuvent être affichées lors de la saisie. Déclarez simplement une nouvelle instance de serveur mandataire (proxy):

proxy = GetRESTProxy() 

Puis sur une nouvelle ligne, tapez proxy suivi du point (.):

Image affichant l'exemple RESTProxy.

Le système Intelli-Prompt affichera automatiquement une zone de liste contenant les membres disponibles. Une fois la méthode choisie, taper la parenthèse ouvrante activera à nouveau le système Intelli-Prompt pour révéler les paramètres:

Image affichant le système Intelli-Prompt montrant une boîte lumineuse contenant les membres disponibles.

Properties

Propriété Détails
StatusCode Contient le code d'état HTTP après un appel à MakeRestRequest().
StatusDescription Contient la description de l'état HTTP après un appel à MakeRestRequest().
ContentType Permet de remplacer l'en-tête de type de contenu par défaut. La valeur par défaut est 'Form-urlencoded'. Si vous envoyez du JSON, vous devez le remplacer par ‘application/json’ par exemple.
ProxyTimeoutSeconds Permet de modifier le délai d'expiration de la demande par défaut. La valeur par défaut est 10 secondes.

Méthodes

Méthode Détails
string urlencode(valeur de chaîne - string value)
Description Méthode d'assistance pour coder une chaîne au format de codage Url.
MakeRestRequest Exécute une requête HTTP vers l'URL désignée.
ClearHeaders Efface tous les en-têtes personnalisés ajoutés avec AddHeader.
AddHeader Ajoute un en-tête personnalisé à la demande HTTP.
MakeTwitterOauthRequest Construit une demande spéciale pour communiquer avec Twitter.
GetSalesForceOAuthToken Génère un jeton d'autorisation spécial requis par SalesForce.com.