The XTEND server provides to AJAX application developers two types of REST Web services which may be called directly from the Web browser via a HTTP request.
Only XTEND applications can access those services.
The engine takes into account only the REST requests that have an XTEND session associated via cookie (or URL setup) JSESSIONID.
The XTEND REST services are only available on the XTEND server.
They "encapsulate" the SOAP X3 Web service call.
The structures of REST data exchanged for the setup transfer (keys and data) and the result return (data and messages) are the same as for the SOAP services.
Only the exchange protocol with the customer is different.
This section presents the available SOAP X3 Web services as well as the associated data structures.
It is necessary to have a knowledge of SOAP X3 Web services before using XTEND REST services.
public CAdxCallContext {
//X3 language code
String codeLang;
//X3 user code
String codeUser;
//X3 password
String password;
//Alias of the connection pool on the Web services server
String poolAlias;
//Configuration setups (query string)
String requestConfig;
}
The setups adxwss.optreturn=JSON/XML of the query string requestConfig indicate the type of result (XML by default).
The Web service server detects automatically the XML or JSON format upon entry.
The JSON format proposes options in order to filter the data sent by the Web service.
The options are defined:
The JSON option is a JSON object has at least one of the fields below.
{
OPTIONS:["nolabels","noclobs","nogroups","norows"],
LANG:"ENG",
EXCLUDEGRP:["GRP1","GRP2"],
INCLUDEGRP:["GRP1","GRP2"],
EXCLUDEFLD:["FLD1","FLD2"],
INCLUDEFLD:["FLD1","FLD2"]
}
noGroups
No publication groups in return
Each setup of the sub-program or field of the object is a String grid.
noRows
No lines in the grids with dim>1
Each setup of the sub-program or field of the object is a String grid.
noLabels
No labels for local menus
noClobs
The clob fields are not re-sent
The OPTION field allows either a setup grid or a single setup (String)
EXCLUDEGRP
Excludes the mentioned groups
INCLUDEGRP
Includes the mentioned content groups
EXCLUDEFLD
Excludes the mentioned fields
EXCLUDEFLD
Includes the mentioned fields
The fields INCLUDE* and EXCLUDE* allow either a String grid or a single String
The setup CAdxParamKeyValue objectKeys for the methods of X3 object making keys necessary (Read/Query...).
It is a Field/value code grid
public class CAdxParamKeyValue{
private String key;
private String value;
}
The setup String objectXml for an X3 object or String inputXml contains the data for the object or the setups of the sub-program in XML or JSON format.
The JSON format was added for the needs of the AJAX applications.
Example of the call format of the Login Web service AXTDLOGIN of the ASAMPLE site.
JSON setups
JSON option in the call setups: nogroups, norows
{
_JSONOPT:{OPTIONS:["nogroups", "norows"]},
AXPARCOD:["SITCOD", "USRLANG"],
AXPARVAL:["FDBTEST", "FRA"],
AXUSERCODE:"DIS001",
AXPWD:"adonix"
}
XML setups
<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>
The fields <FLD NAME="FieldName"> represent the sub-program setups and are attached to the publication group
The publication groups are defined in the Web service record associated with the sub-program record.
They are represented by nodes <GRP ID="IdGroup"> for setups in dimension 1 and <TAB ID="IdGroup"> for setups in dimension > 1.
The node <LIN> regroups the fields from a same grid having the same index.
The JSON setups take up the same structure but is is not mandatory to use publication groups.
XML sub-program
<PARAM>
<GRP ID=’GRP1’>
<FLD NAME=’CHAMP’>Value</FLD>
</GRP>
<TAB ID=’GRP2’>
<LIN>
<FLD NAME=’CHAMP1’>Value1</FLD>
<FLD NAME=’CHAMP2’>Value1</FLD>
</LIN>
<LIN>
<FLD NAME=’CHAMP1’>Value1</FLD>
<FLD NAME=’CHAMP2’>Value2</FLD>
</LIN>
</TAB>
</PARAM>
JSON sub-program
/*--- Without the groups ---*/
{
CHAMP:"Value",
CHAMP1:["Value1","Value2"],
CHAMP2:["Value1","Value2"]
}
/*--- With the groups ---*/
{
GRP1:{
CHAMP:"Value"
},
GRP2:[
{
CHAMP1:"Value1",
CHAMP2:"Value1"
},
{
CHAMP1:"Value2",
CHAMP2:"Value2"
}
]
}
The same structure is used as for sub-programs but the group names are coded depending on the location of the section on screen.
In JSON mode it is not mandatory to specify the group names.
The developer chooses whether or not to specify the group name when using a field of the X3 object whose name alone is not sufficient to identify it.
There may be several fields with the same name in an X3 object.
Example for SOH order
SOH4_1 (lines of the order) corresponds to the 1st section of the 4th screen
XML object
<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 object
{
BPCORD:"DIS001",
SOHTYP:"WEB",
SALFCY:"ASN",
STOFCY:"ASN",
ITMREF:["CUB100","CD100"],
ITMREF:["50","10"]
}
/*--------------- Call of a SUB-PROGRAM ---------------*/
public CAdxResultXml run(
CAdxCallContext callContext,
String publicName,
String inputXml) throws Exception;
/*--------------- Call of an X3 sub-OBJECT ---------------*/
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;
}
The call of a Web service always returns a result object CAdxResultXml which contains:
X3 application errors are not returned as exceptions.
The JSON format does not take into account setups of type BLOB containing binary data.
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":Error
public String type;
}
Example of result following the call of Login Web service AXTDLOGIN of the ASAMPLE site.
JSON result
JSON Options: norows and 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:[email protected]","0001020304"]
SHIPADR1:["Sage Lyon new","Sage MGE","Sage PARIS"],
SHIPCITY:["LYON","Echirolles","PARIS"],
SHIPZIP:["69443","38130","75834"]
}
XML result
<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">[email protected]</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>
Here are the various processing steps of a REST query:
1. Receipt of the HTTP query by the ajax servlet of XTEND server
2. Search of the associated XTEND session
Via the cookie or the setup of query JSESSIONID
-> Error if no session could be found
3. Analysis of the URL to infer the details of the XTEND site and the service type
Several sites may be open at the same time for an XTEND session
-> Error if site could not be found
4. Execution of the server script or the call of X3 SOAP Web service
1. Read of the access path in the URL
2. Read and compilation of the JavaScript script
3. Execution of the script
1. Read of the XTEND interface code in the URL
The interface refers tp a SOAP Web service
-> Error if the interface is not declared in the site
2. Call setup creation
3. Creation of the call context for the SOAP Web service
4. Call to the SOAP Web service.
5. Creation of the result
http://host:port/xtend/ajax/x3sol/x3folder/xtdsite/type/id[/méthode][?Paramètres]
HTTP POST or GET method
x3sol
X3 solution code
x3folder
X3 folder code
xtdsite
XTEND site code
type
INT for the call to an XTEND interface
SCRIPT for the call to an XTEND server script
id
Interface code
or
Access path to the script with respect to the server script directory of the XTEND site
method
Code of the X3 object method
QUERY, R Read, S Save, M Modify,D Delete
Setups
Query string which may contain:
Script
http://host/xtend/ajax/SOLPAIE/PAIE/FDBTEST/SCRIPT/ajaxTest1.js
Sub-program
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
X3 object left list
http://host/xtend/ajax/SOLPAIE/PAIE/FDBTEST/INT/OBJAYZ/QUERY?_COUNT=10&FRMCOD=09*
&_JSONOPT=%7B%22OPTIONS%22%5B%22nogroups%22%7D
The setups of type data other than those of the query string are used in the body of the HTTP query.
The format of setups for the call to an XTEND interface are given by the ContentType of the HTTP query:
The default ContentType is application/json.
The format of data for the call to a server script is compulsorily application/json.
When calling to an XTEND interface, it is possible to require an XML return format (application/xml) or JSON (application/json) by valuing the HTTP header dedicated xtd-Accept.
The mime-type by default is application/xml.
The query sends the sub-program setups or the X3 object data in the required format.
The format of data sent by the call to a server script is free.
The application messages are sent to three specific HTTP headers.
Contains error messages
Contains warning messages
Contains information messages
An X3 application error is processed as an exception
The X3 application errors and compilation/execution errors of server scripts are sent in the form of an HTTP error of code 600.
The JAVA exceptions are sent in the form of anHTTP error of code 500.
The body of the query contains a description (ContentType=text/plain) of the error which depends on the exception type.
In the case of an X3 error, the HTTP xtd-msg-error header contains error messages