Este parágrafo apresenta de maneira geral os Web services SOAP X3 disponíveis assim que a estrutura de dados associados.
O conhecimento dos web service SOAP X3 está indispensável para utilizar os serviços REST de XTEND.
public CAdxCallContext {
//Código língua X3
String codeLang;
//Código utilizador X3
String codeUser;
//Palavra chave X3
String password;
//Alias da "pool" de conexão sobre o servidor de web services
String poolAlias;
//Parâmetros de configuração (query string)
String requestConfig;
}
Os parâmetros adxwss.optreturn=JSON/XML da query string requestConfig indica o tipo de resultado (XML por defeito).
O servidor de web service detecta automáticamente o formato XML ou JSON em entrada.
O formato JSON propõe as opções para filtrar os dados reenviados pelo web service.
As opções são passadas :
A opção JSON é um objeto JSON que comporta pelo menos um dos campos a seguir.
{
OPÇÕES:["nolabels","noclobs","nogroups","norows"],
LANG:"FRA",
EXCLUDEGRP:["GRP1","GRP2"],
INCLUDEGRP:["GRP1","GRP2"],
EXCLUDEFLD:["FLD1","FLD2"],
INCLUDEFLD:["FLD1","FLD2"]
}
noGroups
Sem grupos de publicação em retorno
Cada parâmetro do sub-programa ou campo de objeto é um quadro de String.
noRows
Sem linhas no quadros com dim>1
Cada parâmetro do sub-programa ou campo do objeto é um quadro de String
noLabels
Sem labels para os menus locais
noClobs
Os campos clob não são reenviados
O campo OPÇÃO aceita seja um quadro de parâmetro seja um único parâmetro (String)
EXCLUDEGRP
Exclui os grupos mencionados
INCLUDEGRP
Inclui os grupos contidos mencionados
EXCLUDEFLD
Exclui os campos mencionados
INCLUDEFLD
Inclui os campos mencionados
Os campos INCLUDE* e EXCLUDE* aceitam seja um quadro de Strings seja uma String
O parâmetro CAdxParamKeyValue objectKeys para os métodos dos objetos X3 que necessitam das chaves (Read/Query...).
Trata-se de um quadro codeChamp/valeur.
public class CAdxParamKeyValue{
private String key;
private String value;
}
O parâmetro String objectXml para um objeto X3 ou String inputXml contém os dados de objeto ou os parâmetros do sub-programa ao formato XML ou JSON.
O formato JSON foi acrescentado para as necessidades das aplicações AJAX.
Exemplo de formato de chamada do web service de login AXTDLOGIN do estabelecimento ASAMPLE.
Param JSON
Opção JSON nos parâmetros de chamada : 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>
Os campos <FLD NAME="FieldName"> representam os parãmetros do sub-programa e seu anexamento ao grupo de publicação.
Os grupod de publicações são definidas na ficha Web service associado à ficha do sub-programa.
São representados pelos nós <GRP ID="IdGroup"> para os parâmetros de dimensão 1 e <TAB ID="IdGroup"> para os parâmetros de dimenção > 1.
Os nós <LIN> reagrupa os campos de um mesmo grupo quadro tendo o mesmo índice.
Os parâmetrosJSON retoma a mesma estrutura mas não é obrigado de utilizar os grupos de publicação
Sub Programa 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>
Sub Programa JSON
/*--- Sem os grupos ---*/
{
CHAMP:"Valeur",
CHAMP1:["Valeur1","Valeur2"],
CHAMP2:["Valeur1","Valeur2"]
}
/*--- Com os grupos ---*/
{
GRP1:{
CHAMP:"Valeur"
},
GRP2:[
{
CHAMP1:"Valeur1",
CHAMP2:"Valeur1"
},
{
CHAMP1:"Valeur2",
CHAMP2:"Valeur2"
}
]
}
Mesma estrutura que os sub-programas mas os nomes de grupos são codificados em função do local do bloco no ecrã.
Em modo JSON não está obrigatório de especificar os nomes dos grupos.
É deixado ao programador a iniciativa de especificar o nome de umgrupo no caso onde se deseja utilizar um campo de objeto X3 cujo nome apenas não permite de identificar
Pode ter vários campos de mesmo nome num objeto X3
Exemplo para a encomenda SOH
SOH4_1 (linhas da encomenda) corresponde ao 1º bloco do 4º ecrã
Objeto 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>
Objeto JSON
{
BPCORD:"DIS001",
SOHTYP:"WEB",
SALFCY:"ASN",
STOFCY:"ASN",
ITMREF:["CUB100","CD100"],
ITMREF:["50","10"]
}
/*--------------- Chamada de um SUB-PROGRAMA ---------------*/
public CAdxResultXml run(
CAdxCallContext callContext,
String publicName,
String inputXml) throws Exception;
/*--------------- Chamada de um SUB-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;
}
A chamada d um web service reenvia sempre um objeto resultado CAdxResultXml que contém :
Os erros aplicativos X3 não são reenviados como excepções.
O formato JSON ignora os parâmetros de tipo BLOB que contêm binário
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":Erro
public String type;
}
Exemplo de resultado seguinte à chamada do web service de login AXTDLOGIN do estabelecimento ASAMPLE.
Resultado JSON
Opções JSON norows e 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"]
}
Resultado 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>
Eis as diferentes etapas de tratamento de um pedido REST:
1. Receção do pedido HTTP por servlet ajax do servidor XTEND
2. Pesquisa da sessão XTEND associado.
Via o cookie ou o parâmetro do pedido JSESSIONID
-> Erro se nenhuma sessão não foi encontrada
3. Análise de URL para deduzir as coordenadas do estabelecimeto XTEND e o tipo de serviço
Vários estabelecimentos podem ser abertos simultâniamente por uma sessão XTEND
-> Erro se estabelecimento não encontrado
4. Execução do script servidor ou chamada do web service SOAP X3
1. Leitura do caminho de acesso na URL
2. Leitura e compilação do script JavaScript
3. Execução do script
1. Leitura do codigo de interface XTEND em URL.
O interface faz referência a um web service SOAP
-> Erro se interface não declarado no estabelecimento.
2. Constituição dos parâmetros de chamada.
3. Constituição do contexto de chamada do web service SOAP
4. Chamada do web service SOAP
5. Constituição do resultado
http://host:port/xtend/ajax/x3sol/x3folder/xtdsite/type/id[/méthode][?Paramètres]
Método HTTP POST ou GET
x3sol
Código solução X3
x3folder
Código dossier X3
xtdsite
Código estabelecimento XTEND
type
INT para uma chamada de uma interface XTEND
SCRIPT para chamada de um script server XTEND
id
Código de interface
ou
Caminho de acesso do script por relação ao directório dos scripts do servidor do estabelecimento XTEND.
método
Código do método de objecto X3
QUERY, R Read, S Save, M Modify,D Delete
Parâmetros
Query string que pode conter :
Script
http://host/xtend/ajax/SOLPAIE/PAIE/FDBTEST/SCRIPT/ajaxTest1.js
Sub-programa
http://host/xtend/ajax/SOLPAIE/PAIE/FDBTEST/INT/AXTDLOGIN
Objeto X3 - Read
http://host/xtend/ajax/SOLPAIE/PAIE/FDBTEST/INT/OBJAYZ/R?FRMCOD=0901000002
&_JSONOPT=%7B%22OPTIONS%22%5B%22nogroups%22%7D
Lista esquerda objeto X3
http://host/xtend/ajax/SOLPAIE/PAIE/FDBTEST/INT/OBJAYZ/QUERY?_COUNT=10&FRMCOD=09*
&_JSONOPT=%7B%22OPTIONS%22%5B%22nogroups%22%7D
Os parâametros de tipo dados outro que aqueles da query string são passadas no corpo do pedido HTTP.
O formato dos parâmetros de chamada de uma interface XTEND são dados para o ContentType do pedido HTTP:
O ContentType por defeito está application/json.
O formato dos dados para uma chamada de um script server está obrigatoriamente application/json.
No momento de chamada de uma interface XTEND pode-se pedir um formato de devolução XML (application/xml) ou JSON (application/json) em valorizando o cabeçalho HTTP dedicado xtd-Accept.
O mesmo tipo por defeito é application/xml.
O pedido reenvia os parâmetros do sub-programa ou os dados do objecto X3 ao formato pedido.
O formato dos dados reenviado por chamada de um script está livre.
As mensagens aplicativas são reenviadas nos três cabeçalhos HTTP específicos.
Contém as mensagens de erro
Contem as mensagens de aviso (warning)
Contém as mensagens de informação
Um erro aplicativo X3 está tratado como uma exceção.
Os erros aplicativos X3 e erros de compilação/execução dos scripts serveur são reenviados sob a forma de um erroHTTP de código 600.
As exceções JAVA são reenviadas sob a forma de um erro HTTP de código 500.
O corpo do pedido contém uma descrição (ContentType=texto/pleno) de erro que depende do tipo de exceção.
No caso de um erro X3 o cabeçalho HTTP xtd-msg-error contém as mesagens de erro.