Ce paragraphe présente de manière générale les Web services SOAP X3 disponibles ainsi que les structures de données associées.
La connaissance des web service SOAP X3 est indispensable pour utiliser les services REST d'XTEND.
public CAdxCallContext {
//Code langue X3
String codeLang;
//Code utilisateur X3
String codeUser;
//Mot de passe X3
String password;
//Alias du pool de connexion sur le serveur de web services
String poolAlias;
//Paramètres de configuration (query string)
String requestConfig;
}
Les paramètre adxwss.optreturn=JSON/XML de la query string requestConfig indique le type de résultat (XML par défaut).
Le serveur de web service détecte automatiquement le format XML ou JSON en entrée.
Le format JSON propose des options pour filtrer les données renvoyées par le web service.
Les options sont passées :
L'option JSON est un objet JSON qui comporte au moins un des champs ci-dessous.
{
OPTIONS:["nolabels","noclobs","nogroups","norows"],
LANG:"FRA",
EXCLUDEGRP:["GRP1","GRP2"],
INCLUDEGRP:["GRP1","GRP2"],
EXCLUDEFLD:["FLD1","FLD2"],
INCLUDEFLD:["FLD1","FLD2"]
}
noGroups
Pas de groupes de publication en retour
Chaque paramètre du sous-programme ou champ de l'objet est un tableau de String
noRows
Pas de lignes dans les tableaux avec dim>1
Chaque paramètre du sous-programme ou champ de l'objet est un tableau de String
noLabels
Pas de labels pour les menus locaux
noClobs
Les champs clob ne sont pas renvoyés
Le champs OPTION accepte soit un tableau de paramètre soit un seul paramètre (String)
EXCLUDEGRP
Exclut les groupes mentionnés
INCLUDEGRP
Inclut les groupes contenus mentionnés
EXCLUDEFLD
Exclut les champs mentionnés
INCLUDEFLD
Inclut les champs mentionnés
Les champs INCLUDE* et EXCLUDE* acceptent soit un tableau de Strings soit un String
Le paramètre CAdxParamKeyValue objectKeys pour les méthodes des objets X3 qui nécessitent des clés (Read/Query...).
Il s'agit d'un tableau codeChamp/valeur.
public class CAdxParamKeyValue{
private String key;
private String value;
}
Le paramètre String objectXml pour un objet X3 ou String inputXml contient les données de l'objet ou les paramètre du sous-programme au format XML ou JSON.
Le format JSON a été ajouté pour les besoins des application AJAX.
Exemple de format d'appel du web service de login AXTDLOGIN du site ASAMPLE.
Param JSON
Option JSON dans les paramètres d'appel : nogroups, norows
{
_JSONOPT:{OPTIONS:["nogroups", "norows"]},
AXPARCOD:["SITCOD", "USRLANG"],
AXPARVAL:["FDBTEST", "FRA"],
AXUSERCODE:"DIS001",
AXPWD:"adonix"
}
Param XML
<PARAM>
<TAB ID="AX_PAR">
<LIN NUM="1">
<FLD NAME="AXPARCOD">SITCOD</FLD>
<FLD NAME="AXPARVAL">FDBTEST</FLD>
</LIN>
<LIN NUM="2">
<FLD NAME="AXPARCOD">USRLANG</FLD>
<FLD NAME="AXPARVAL">FRA</FLD>
</LIN>
</TAB>
<GRP ID="AXLOG_PAR">
<FLD NAME="AXUSERCODE">DIS001</FLD>
<FLD NAME="AXPWD">adonix</FLD>
</GRP>
</PARAM>
Les champs <FLD NAME="FieldName"> représentent les paramètres du sous-programme et sont rattachés au groupe de publication
Les groupes de publications sont définis dans la fiche Web service associé à la fiche du sous-programme.
Ils sont représentés par les noeuds <GRP ID="IdGroup"> pour les paramètres de dimension 1 et <TAB ID="IdGroup"> pour les paramètres de dimension > 1.
Le noeuds <LIN> regroupe les champs d'un même groupe tableau ayant le même indexe.
Les paramètres JSON reprennent la même structure mais on n'est pas obligé d'utiliser les groupes de publication.
Sous Programme XML
<PARAM>
<GRP ID=’GRP1’>
<FLD NAME=’CHAMP’>Valeur</FLD>
</GRP>
<TAB ID=’GRP2’>
<LIN>
<FLD NAME=’CHAMP1’>Valeur1</FLD>
<FLD NAME=’CHAMP2’>Valeur1</FLD>
</LIN>
<LIN>
<FLD NAME=’CHAMP1’>Valeur1</FLD>
<FLD NAME=’CHAMP2’>Valeur2</FLD>
</LIN>
</TAB>
</PARAM>
Sous Programme JSON
/*--- Sans les groupes ---*/
{
CHAMP:"Valeur",
CHAMP1:["Valeur1","Valeur2"],
CHAMP2:["Valeur1","Valeur2"]
}
/*--- Avec les groupes ---*/
{
GRP1:{
CHAMP:"Valeur"
},
GRP2:[
{
CHAMP1:"Valeur1",
CHAMP2:"Valeur1"
},
{
CHAMP1:"Valeur2",
CHAMP2:"Valeur2"
}
]
}
Même structure que les sous-programme mais les noms des groupes sont codés en fonction de la place du bloc dans l'écran.
En mode JSON il n'est pas obligatoire de spécifier les noms des groupes.
Il est laissé au développeur l'initiative de spécifier le nom du groupe dans le cas où il souhaite utiliser un champ de l'objet X3 dont le nom seul ne permet pas de l'identifier.
On peut avoir plusieurs champs de même nom dans un objet X3.
Exemple pour la commande SOH
SOH4_1 (lignes de la commande) correspond au 1er bloc du 4eme écran
Objet XML
<PARAM>
<GRP ID="SOH0_1">
<FLD NAME="BPCORD">DIS001</FLD>
<FLD NAME="SOHTYP">WEB</FLD>
<FLD NAME="SALFCY">ASN</FLD>
</GRP>
<GRP ID="SOH2_1">
<FLD NAME="STOFCY">ASN</FLD>
</GRP>
<TAB ID="SOH4_1">
<LIN>
<FLD NAME="ITMREF">CUB100</FLD>
<FLD NAME="QTY">50</FLD>
</LIN>
<LIN>
<FLD NAME="ITMREF">CD100</FLD>
<FLD NAME="QTY">10</FLD>
</LIN>
</TAB>
</PARAM>
Objet JSON
{
BPCORD:"DIS001",
SOHTYP:"WEB",
SALFCY:"ASN",
STOFCY:"ASN",
ITMREF:["CUB100","CD100"],
ITMREF:["50","10"]
}
/*--------------- Appel d'un SOUS-PROGRAMME ---------------*/
public CAdxResultXml run(
CAdxCallContext callContext,
String publicName,
String inputXml) throws Exception;
/*--------------- Appel d'un sous OBJET X3---------------*/
public CAdxResultXml save(
CAdxCallContext callContext,
String publicName,
String objectXml) throws Exception;
//------------------------------------------
public CAdxResultXml delete(
CAdxCallContext callContext,
String publicName,
CAdxParamKeyValue[] objectKeys) throws Exception;
//------------------------------------------
public CAdxResultXml read(
CAdxCallContext callContext,
String publicName,
CAdxParamKeyValue[] objectKeys) throws Exception;
//------------------------------------------
public CAdxResultXml query(
CAdxCallContext callContext,
String publicName,
CAdxParamKeyValue[] objectKeys,
int listSize) throws Exception;
//------------------------------------------
public CAdxResultXml modify(
CAdxCallContext callContext,
String publicName,
CAdxParamKeyValue[] objectKeys,
String objectXml) throws Exception;
//------------------------------------------
public CAdxResultXml actionObject(
CAdxCallContext callContext,
String publicName,
String actionCode,
CAdxParamKeyValue[] objectKeys) throws Exception;
//------------------------------------------
public CAdxResultXml actionObject(
CAdxCallContext callContext,
String publicName,
String actionCode
String objectXml) throws Exception;
}
L'appel d'un web service renvoie toujours un objet résultat CAdxResultXml qui contient :
Le erreurs applicatives X3 ne sont pas renvoyées comme des exceptions.
Le format JSON ignore les paramètre de type BLOB qui contiennent du binaire.
public class CAdxResultXml{
public CAdxMessage[] messages;
public String resultXml;
public int status;
public CAdxTechnicalInfos technicalInfos;
}
public class CAdxMessage {
public String message;
//"1":Information - "2":Warning - "3":Erreur
public String type;
}
Exemple de résultat suite à l'appel du web service de login AXTDLOGIN du site ASAMPLE.
Résultat JSON
Options JSON : norows et nogroups
{
AXPARCOD:["SITCOD","USRLANG"],
AXPARVAL:["FDBTEST","FRA"]
AXUSERCODE:"DIS001",
AXPWD:"adonix",
AXUSERPROF:"B2B",
AX3SOL:["SOLPAIE","X3V5","XTENDV2"],
AX3FLDR:["PAIE","X3TESTV5","DEMOFRA"],
AX3LANG:["FRA","FRA","FRA"],
AX3USER:["XTEND","JPJ1","OG"],
AXLOGCOD:["NAME","FIRSTNAME","EMAIL","PHONE"],
AXLOGVAL:["DALBO","Frédéric","../FCT/mailto:fdb@sg.com","0001020304"]
SHIPADR1:["Sage Lyon new","Sage MGE","Sage PARIS"],
SHIPCITY:["LYON","Echirolles","PARIS"],
SHIPZIP:["69443","38130","75834"]
}
Résultat XML
<RESULT>
<TAB DIM="20" ID="AX_PAR" SIZE="2">
<LIN NUM="1">
<FLD NAME="AXPARCOD" TYPE="Char">SITCOD</FLD>
<FLD NAME="AXPARVAL" TYPE="Char">FDBTEST</FLD>
</LIN>
<LIN NUM="2">
<FLD NAME="AXPARCOD" TYPE="Char">USRLANG</FLD>
<FLD NAME="AXPARVAL" TYPE="Char">FRA</FLD>
</LIN>
</TAB>
<GRP ID="AXLOG_PAR">
<FLD NAME="AXUSERCODE" TYPE="Char">DIS001</FLD>
<FLD NAME="AXPWD" TYPE="Char">adonix</FLD>
<FLD NAME="AXUSERPROF" TYPE="Char">B2B</FLD>
</GRP>
<TAB DIM="10" ID="AXLOG_X3" SIZE="3">
<LIN NUM="1">
<FLD NAME="AX3SOL" TYPE="Char">SOLPAIE</FLD>
<FLD NAME="AX3FLDR" TYPE="Char">PAIE</FLD>
<FLD NAME="AX3LANG" TYPE="Char">FRA</FLD>
<FLD NAME="AX3USER" TYPE="Char">XTEND</FLD>
</LIN>
<LIN NUM="2">
<FLD NAME="AX3SOL" TYPE="Char">X3V5</FLD>
<FLD NAME="AX3FLDR" TYPE="Char">X3TESTV5</FLD>
<FLD NAME="AX3LANG" TYPE="Char">FRA</FLD>
<FLD NAME="AX3USER" TYPE="Char">JPJ1</FLD>
</LIN>
<LIN NUM="3">
<FLD NAME="AX3SOL" TYPE="Char">XTENDV2</FLD>
<FLD NAME="AX3FLDR" TYPE="Char">DEMOFRA</FLD>
<FLD NAME="AX3LANG" TYPE="Char">FRA</FLD>
<FLD NAME="AX3USER" TYPE="Char">OG</FLD>
</LIN>
</TAB>
<TAB DIM="50" ID="AXLOG_RES" SIZE="4">
<LIN NUM="1">
<FLD NAME="AXLOGCOD" TYPE="Char">NAME</FLD>
<FLD NAME="AXLOGVAL" TYPE="Char">DALBO</FLD>
</LIN>
<LIN NUM="2">
<FLD NAME="AXLOGCOD" TYPE="Char">FIRSTNAME</FLD>
<FLD NAME="AXLOGVAL" TYPE="Char">Frédéric</FLD>
</LIN>
<LIN NUM="3">
<FLD NAME="AXLOGCOD" TYPE="Char">EMAIL</FLD>
<FLD NAME="AXLOGVAL" TYPE="Char">fdb@sg.com</FLD>
</LIN>
<LIN NUM="4">
<FLD NAME="AXLOGCOD" TYPE="Char">PHONE</FLD>
<FLD NAME="AXLOGVAL" TYPE="Char">0001020304</FLD>
</LIN>
</TAB>
<TAB DIM="20" ID="LOGINSHIP" SIZE="3">
<LIN NUM="1">
<FLD NAME="SHIPADR1" TYPE="Char">Sage Lyon new</FLD>
<FLD NAME="SHIPCITY" TYPE="Char">LYON</FLD>
<FLD NAME="SHIPZIP" TYPE="Char">69443</FLD>
</LIN>
<LIN NUM="2">
<FLD NAME="SHIPADR1" TYPE="Char">Sage MGE</FLD>
<FLD NAME="SHIPCITY" TYPE="Char">Echirolles</FLD>
<FLD NAME="SHIPZIP" TYPE="Char">38130</FLD>
</LIN>
<LIN NUM="3">
<FLD NAME="SHIPADR1" TYPE="Char">Sage PARIS</FLD>
<FLD NAME="SHIPCITY" TYPE="Char">PARIS</FLD>
<FLD NAME="SHIPZIP" TYPE="Char">75834</FLD>
</LIN>
</TAB>
</RESULT>
Voici les différentes étapes de traitement d'une requête REST:
1. Réception de la requête HTTP par le servlet ajax du serveur XTEND
2. Recherche de la session XTEND associée
Via le cookie ou le paramètre de la requête JSESSIONID
-> Erreur si aucune session n'a été trouvée
3. Analyse de l'URL pour en déduire les coordonnées du site XTEND et le type de service
Plusieurs sites peuvent être ouverts simultanément par une session XTEND
-> Erreur si site non trouvé
4. Exécution du script serveur ou appel du web service SOAP X3
1. Lecture du chemin d'accès dans l'URL
2. Lecture et compilation du script JavaScript
3. Exécution du script
1. Lecture du code de l'interface XTEND dans l'URL
L'interface fait référence à un web service SOAP
-> Erreur si interface non déclarée dans le site
2. Constitution des paramètres d'appel
3. Constitution du contexte d'appel du web service SOAP
4. Appel du web service SOAP
5. Constitution du résultat
http://host:port/xtend/ajax/x3sol/x3folder/xtdsite/type/id[/méthode][?Paramètres]
Méthode HTTP POST ou GET
x3sol
Code solution X3
x3folder
Code dossier X3
xtdsite
Code site XTEND
type
INT pour l'appel d'une interface XTEND
SCRIPT pour l'appel d'un script server XTEND
id
Code de l'interface
ou
Chemin d'accès du script par rapport au répertoire des scripts serveur du site XTEND
méthode
Code de la méthode de l'objet X3
QUERY, R Read, S Save, M Modify,D Delete
Paramètres
Query string qui peut contenir:
Script
http://host/xtend/ajax/SOLPAIE/PAIE/FDBTEST/SCRIPT/ajaxTest1.js
Sous-programme
http://host/xtend/ajax/SOLPAIE/PAIE/FDBTEST/INT/AXTDLOGIN
Objet X3 - Read
http://host/xtend/ajax/SOLPAIE/PAIE/FDBTEST/INT/OBJAYZ/R?FRMCOD=0901000002
&_JSONOPT=%7B%22OPTIONS%22%5B%22nogroups%22%7D
Liste gauche objet X3
http://host/xtend/ajax/SOLPAIE/PAIE/FDBTEST/INT/OBJAYZ/QUERY?_COUNT=10&FRMCOD=09*
&_JSONOPT=%7B%22OPTIONS%22%5B%22nogroups%22%7D
Les paramètres de type données autre que ceux de la query string sont passés dans le corps de la requête HTTP.
Le format des paramètres d'appel d'une interface XTEND sont donnés par le ContentType de la requête HTTP:
Le ContentType par défaut est application/json.
Le format des données pour l'appel d'un script serveur est obligatoirement application/json.
Lors de l'appel d'une interface XTEND on peut demander un format de retour XML (application/xml) ou JSON (application/json) en valorisant le Header HTTP dédié xtd-Accept.
Le mime-type par défaut est application/xml.
La requête renvoie les paramètres du sous-programme ou les données de l'objet X3 au format demandé.
Le format des données renvoyé par l'appel d'un script serveur est libre.
Les messages applicatifs sont renvoyés dans trois headers HTTP spécifiques.
Contient les messages d'erreur
Contient les messages warning
Contient les messages d'information
Une erreur applicative X3 est traitée comme une exception
Les erreurs applicatives X3 et erreurs de compilation/exécution des scripts serveur sont renvoyées sous le forme d'une erreurHTTP de code 600.
Les exception JAVA sont renvoyées sous le forme d'une erreur HTTP de code 500.
Le corps de la requête contient une description (ContentType=text/plain) de l'erreur qui dépend du type d'exception.
Dans le cas d'une erreur X3 le header HTTP xtd-msg-error contient les messages d'erreur