Web services REST 

Introduction

Le serveur XTEND met à disposition des développeurs d'applications AJAX deux types de web services REST qui peuvent être invoqués directement à partir du navigateur web par une requête HTTP.

Ces services ne sont accessibles qu'aux applications XTEND.

Le moteur ne prend en compte que les requêtes REST qui ont une session XTEND associée via le cookie (ou le paramètre de l'URL) JSESSIONID.

Les services REST XTEND ne sont disponibles que sur le serveur XTEND.

Ils 'encapsulent' l'appel des web services SOAP X3.

Les structures des données REST échangées pour le passage des paramètres (clés et données) et le retour du résultat (données et messages) sont identiques à celles des services SOAP.

Seul le protocole d'échange avec le client est différent.

Rappel sur les web services SOAP X3

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.

Paramètres d'appel

Paramètres obligatoires
  • Le contexte d'appel CAdxCallContext callContext
    Contient les information de login X3 et sur le pool de connexion qui va traiter la requête
  • Le nom de publication du web service String publicName défini lors de la publication

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.

Options JSON

Le format JSON propose des options pour filtrer les données renvoyées par le web service.

Les options sont passées :

  • soit dans la query string requestConfig via le paramètre adxwss.optjson
    requestConfig=adxwss.optreturn=JSON&adxwss.optjson={"OPTIONS":"noGoups"}
  • soit dans les paramètres JSON de l'objet ou du sous programme via le champ "_JSONOPT"
    Voir exemple des paramètres d'appel JSON

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"]
}

OPTIONS

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

Paramètres clé d'objet X3

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;
}

Paramètres données

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>

Structure paramètre données sous-programme

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"       
        }
    ]
}

Structure paramètre données Objet X3

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"]
}

Services

/*--------------- 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;
}

Résultat

L'appel d'un web service renvoie toujours un objet résultat CAdxResultXml qui contient :

  • les données de l'objet ou paramètres du sous-programme au format XML ou JSON
    String resultXml
  • les messages application de type erreur, warning ou information
    CAdxMessage messages
  • des information techniques sur l'exécution du sous programme
    CAdxTechnicalInfos technicalInfos

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>

Web services REST XTEND

Principe de fonctionnement

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

Traitement du script serveur

1. Lecture du chemin d'accès dans l'URL

2. Lecture et compilation du script JavaScript

3. Exécution du script

      • Le script a la capacité d'accéder aux données de la session et d'appeler des web services SOAP X3
      • L'instruction print du script est utilisée pour renvoyer la réponse (XML, JSON, HTML...)
Traitement de l'appel du web service SOAP X3

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

      • Les données XML ou JSON sont lues dans le corps de la requête
      • Les clés sont lues dans la 'Query String'
      • Le type de résultat demandé XML ou JSON est lu dans le header HTTP xtd-accept

3. Constitution du contexte d'appel du web service SOAP

      • Le point d'entrée (URL) est donné par le site XTEND (Pool web service du site ou de l'interface)
      • Le code utilisateur X3, Mot de passe en langue sont donné par la session XTEND

4. Appel du web service SOAP

5. Constitution du résultat

      • Les messages ont transmis dans le header HTTP
        xtd-msg-error, xtd-msg-warning,xtd-msg-info
      • Les données XML/JSON renvoyées par le web service SOAP sont transmises sans modification dans le corps de la requête

Format de l'URL

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:

    • Les champs clés d'un objet X3
    • Les paramètres d'une liste gauche
    • Les options JSON via la clé _JSONOPT si elles ne sont pas passées dans les paramètres données
Exemples

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

Envoie des données

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:

  • application/json
    La structure des données doit être conforme aux format attendu
  • application/xml
    Les données XML doivent être conforme aux format attendu
  • application/x-www-form-urlencoded
    Dans ce cas on considère que la liste des champs/valeurs constitue un objet JSON conforme au format attendu

Le ContentType par défaut est application/json.

Le format des données pour l'appel d'un script serveur est obligatoirement application/json.

Résultat

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.

Messages applicatifs

Les messages applicatifs sont renvoyés dans trois headers HTTP spécifiques.

xtd-msg-error

Contient les messages d'erreur

xtd-msg-warning

Contient les messages warning

xtd-msg-info

Contient les messages d'information

Une erreur applicative X3 est traitée comme une exception

Exceptions

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