In diesem Absatz werden die verfügbaren X3-SOAP-Webservices und die zugehörigen Datenstrukturen allgemein beschrieben.
Zur Verwendung der XTEND-REST-Services sind Kenntnisse der X3-SOAP-Webservice unerlässlich.
public CAdxCallContext {
// X3-Sprachcode
String codeLang;
// X3-Benutzercode
String codeUser;
// X3-Passwort
String password;
// Alias des Verbindungspools auf dem Webservice-Server
String poolAlias;
// Konfigurationsparameter (query string)
String requestConfig;
}
Der Parameter adxwss.optreturn=JSON/XML der Abfrage string requestConfig gibt den Ergebnistyp an (per Default XML).
Der Webservice-Server ermittelt automatisch bei der Eingabe das XML- oder JSON-Format.
Im JSON-Format stehen Optionen zum Filtern der vom Webservice zurückgegebenen Daten zur Verfügung.
Diese Optionen werden übergeben:
Die JSON-Option ist ein JSON-Objekt, das mindestens eines der folgenden Attribute umfasst.
{
OPTIONS:["nolabels","noclobs","nogroups","norows"],
LANG:"FRA",
EXCLUDEGRP:["GRP1","GRP2"],
INCLUDEGRP:["GRP1","GRP2"],
EXCLUDEFLD:["FLD1","FLD2"],
INCLUDEFLD:["FLD1","FLD2"]
}
noGroups
Keine Veröffentlichungsgruppen als Rückgabe
Jeder Unterprogrammparameter und jeder Objektattributparameter ist eine String-Tabelle
noRows
Keine Zeilen in Tabellen mit dim > 1
Jeder Unterprogrammparameter und jeder Objektattributparameter ist eine String-Tabelle
noLabels
Keine Labels für die Lokalen Menüs
noClobs
Die Clob-Attribute werden nicht zurückgegeben
Die Spalte OPTION akzeptiert eine Parametertabelle oder einen einzelnen Parameter (String)
EXCLUDEGRP
Schließt die genannten Gruppen aus
INCLUDEGRP
Schließt die enthaltenen Gruppen ein
EXCLUDEFLD
Schließt die genannten Attribute aus
INCLUDEFLD
Schließt die genannten Attribute ein
Die Attribute INCLUDE* und EXCLUDE* akzeptieren String-Tabellen und Strings
Parameter CAdxParamKeyValue objectKeys für die X3-Objektmethoden, die Schlüssel benötigen (Read / Query etc.).
Dabei handelt es sich um eine Tabelle Spaltencode / Wert.
public class CAdxParamKeyValue{
private String key;
private String value;
}
Die X3-Objektparameter String objectXml und String inputXml umfassen die Unterprogrammobjektdaten oder -parameter im XML- oder im JSON-Format.
Das JSON-Format wurde für AJAX-Anwendungen hinzugefügt.
Beispiel für das Format beim Aufruf eines Webservice für die Anmeldung AXTDLOGIN an die Website ASAMPLE.
JSON-Parameter
JSON-Option in den Aufrufparametern: nogroups, norows
{
_JSONOPT:{OPTIONS:["nogroups", "norows"]},
AXPARCOD:["SITCOD", "USRLANG"],
AXPARVAL:["FDBTEST", "FRA"],
AXUSERCODE:"DIS001",
AXPWD:"adonix"
}
XML-Parameter
<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>
Die Attribute <FLD NAME="FieldName"> stehen für die Unterprogrammparameter und sind der Veröffentlichungsgruppe zugeordnet.
Die Veröffentlichungsgruppen sind in den Webservice-Daten der Unterprogrammdaten definiert.
Sie werden durch den Knoten <GRP ID="IdGroup"> (eindimensionale Parameter) bzw. <TAB ID="IdGroup"> (mehrdimensionale Parameter) repräsentiert.
Die Spalten derselben Tabellengruppe mit demselben Index sind im Knoten <LIN> gebündelt.
In die JSON-Parameter wird dieselbe Struktur übernommen, die Verwendung von Veröffentlichungsgruppen ist jedoch nicht obligatorisch.
XML-Unterprogramm
<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>
JSON-Unterprogramm
/*--- Ohne die Gruppen ---*/
{
CHAMP:"Valeur",
CHAMP1:["Valeur1","Valeur2"],
CHAMP2:["Valeur1","Valeur2"]
}
/*--- Mit den Gruppen ---*/
{
GRP1:{
CHAMP:"Valeur"
},
GRP2:[
{
CHAMP1:"Valeur1",
CHAMP2:"Valeur1"
},
{
CHAMP1:"Valeur2",
CHAMP2:"Valeur2"
}
]
}
Dieselbe Struktur wie bei den Unterprogrammen, jedoch richtet sich die Benennung der Gruppennamen nach der Position im Maskenblock.
Im JSON-Modus müssen die Gruppennamen nicht angegeben werden.
Es wird dem Entwickler überlassen, den Gruppennamen anzugeben. Dies wird er tun, wenn er ein X3-Objektattribut verwenden möchte, dessen Name nicht alleine für die Identifizierung ausreicht.
Ein X3-Objekt kann mehrere Attribute desselben Namens umfassen.
Beispiel für den SOH-Befehl
SOH4_1 (Befehlszeile) entspricht dem 1. Block in der 4. Maske.
XML-Objekt
<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>
JSON-Objekt
{
BPCORD:"DIS001",
SOHTYP:"WEB",
SALFCY:"ASN",
STOFCY:"ASN",
ITMREF:["CUB100","CD100"],
ITMREF:["50","10"]
}
/*--------------- Aufruf eines UNTERPROGRAMMS ---------------*/
public CAdxResultXml run(
CAdxCallContext callContext,
String publicName,
String inputXml) throws Exception;
/*--------------- Aufruf eines X3-Unterobjekts---------------*/
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;
}
Der Aufruf eines Webservice gibt immer ein CAdxResultXml-Ergebnisobjekt zurück, das folgende Elemente umfasst:
X3-Anwendungsfehler werden nicht als Ausnahmen zurückgegeben.
Das JSON-Format ignoriert Parameter vom Typ Blob, die Binärdaten enthalten.
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;
}
Beispiel für das Ergebnis nach dem Aufruf eines Webservice für die Anmeldung AXTDLOGIN an die Website ASAMPLE.
JSON-Ergebnis
JSON-Optionen: norows und 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"]
}
XML-Ergebnis
<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>
Hier die verschiedenen Verarbeitungsschritte einer REST-Abfrage:
1. Empfang der HTTP-Abfrage durch das AJAX-Servlet des XTEND-Servers
2. Suche nach der zugehörigen XTEND-Sitzung
Über das Cookie oder den Parameter der JSESSIONID-Abfrage
-> Fehler, wenn keine Sitzung gefunden wurde
3. Analyse der URL, um die Adresse der XTEND-Website und den Servicetyp abzuleiten
Pro XTEND-Sitzung können mehrere Websites geöffnet sein
-> Fehler, wenn keine Website gefunden wurde
4. Ausführung des Serverskripts oder Aufruf des X3-SOAP-Webservice
1. Lesen des Zugriffspfads in der URL
2. Lesen und Kompilieren des JavaScript-Skripts
3. Ausführung des Skripts
Verarbeitung des Aufrufs des X3-SOAP-Webservice.
1. Lesen des XTEND-Schnittstellencodes in der URL
Die Schnittstelle enthält eine Referenz auf einen SOAP-Webservice
Die Schlüssel werden aus dem 'Query String' gelesen
3. Aufbau des Aufrufkontexts für den SOAP-Webservice
Der Eingabepunkt (URL) ist durch die XTEND-Website gegeben (Webservice-Pool der Website oder der Schnittstelle)
xtd-msg-error, xtd-msg-warning,xtd-msg-info
Die XML- bzw. JSON-Daten werden vom SOAP-Webservice zurückgegeben und unverändert in den Abfragecode übernommen
URL-Format
http://host:port/xtend/ajax/x3sol/x3folder/xtdsite/type/id[/méthode][?Paramètres]
HTTP-Methoden POST und GET
x3sol
X3-Lösungscode
x3folder
X3-Ordnercode
xtdsite XTEND-Website-Code Typ INT
für den Aufruf einer XTEND- Schnittstelle SCRIPT für den Aufruf eines XTEND-
Skriptservers
id
Schnittstellencode
oder
Zugriffspfad auf das Skript im Skriptverzeichnis des Servers der XTEND-Website
Methode
X3-Objektmethodencode QUERY, R Read, S Save, MModify, D
Delete
Parameter
Beispiele
Skript
http://host/xtend/ajax/SOLPAIE/PAIE/FDBTEST/SCRIPT/ajaxTest1.js
Unterprogramm
http://host/xtend/ajax/SOLPAIE/PAIE/FDBTEST/INT/AXTDLOGIN
X3-Objekt - Read
http://host/xtend/ajax/SOLPAIE/PAIE/FDBTEST/INT/OBJAYZ/R?FRMCOD=0901000002
&_JSONOPT=%7B%22OPTIONS%22%5B%22nogroups%22%7D
Auswahlliste links X3-Objekt
http://host/xtend/ajax/SOLPAIE/PAIE/FDBTEST/INT/OBJAYZ/QUERY?_COUNT=10&FRMCOD=09*
Datenversand Alle anderen Datenparameter neben dem Abfragestring werden im Code
der HTTP-Abfrage übergeben.
In diesem Fall wird die Liste der Felder / Werte als JSON-Objekt betrachtet, das dem erwarteten Format entspricht Per Default ist der ContentType application/json.
Das Datenformat beim Aufruf eines Skriptservers muss application/jsonlauten
Beim Aufruf von XTEND-Schnittstellen kann ein XML- oder JSON-Rückgabeformat verlangt werden (application/xml bzw. application/json). Hierfür ist der entsprechende HTTP-Header xtd-Accept zu belegen.
Per Default ist der Mime-Type application/xml.
Die Abfrage gibt die Unterprogrammparameter oder die X3-Objektdaten im geforderten Format zurück.
Das vom Serverskript zurückgegebene Datenformat ist frei wählbar.
Die Anwendungsmeldungen werden in den drei hierfür vorgesehenen HTTP-Headern zurückgegeben.
Enthält die Fehlermeldungen
Enthält die Warnungen
Enthält die Hinweise
Eine X3-Anwendungsfehlermeldung wird wie eine Ausnahme behandelt
Die X3-Anwendungsfehler und die Kompilierungs- / Ausführungsfehler der Serverskripte werden als HTTP-Fehler600zurückgegeben.
Die JAVA-Ausnahmen werden als HTTP-Fehler 500zurückgegeben.
Der Abfragecode umfasst eine Beschreibung (ContentType=text/plain) des Fehlers, die sich nach dem Ausnahmetyp richtet.
X3-Fehlermeldungen sind im HTTP-Header xtd-msg-error enthalten.