inicializa: função(aCaller,url,aContentType,aReturnedType,params)
{
// Tratamento específico
// Chamada do pedido Ajax de prototype.js
$super(url,options);
},
Objet appelant (voir § suivant)
Url de chamada do web service REST XTEND
ContentType dos dados enviados - null autorizado
ContentType dos dados enviados - null autorizado
Dados enviados no corpo do pedido - null autorizado
Todas as classes e funções são anexadas ao objeto XTENDAJAX.
É o objecto que chama o pedido e que gera o contexto de chamada cujo se terá necessidade para tratar a resposta.
Este objeto deve implementar os métodos seguintes para tratar as diferentes listas da resposta.
//------------------------------------------------
//Chamada se HTTP estatuto é igual = 200
//resposta : Classe Ajax.Response
onSuccess:function(response){
},
//------------------------------------------------
//Chamada se HTTP estatuto é diferente de 200
//pedido : Classe Ajax.Request
//exceção: String ou classe Error
onFailure:function(request, exception){
},
//------------------------------------------------
//Chamada sobre exceção JavaScript
//pedido : Classe Ajax.Request
onException :function(response,headerJSON){
}
As funções onFailure e onException são facultativas.
Se o objeto chamador não os implementa as funções de afixação XTENDAJAX.displayException e XTENDAJAX.displayFailure serão chamados.
O exemplo a seguir cchama o web service REST identificado pelo paâmetro aURL com os dados aData e afixa a resposta.
var wClassCaller=Class.create({
onSuccess:function(response){
response.xtdDisplay();
},
call:function(aURL,aData){
new XTENDAJAX.request(this,aURL,null,null,aData);
}
});
var wURL="http://ecfdalbopro:28980/xtend/ajax/SOLPAIE/PAIE/FDBTEST/INT/XTDLOGIN";
var wInput={
_JSONOPT:{OPTIONS:"nogroups"},
AXUSERCODE:"DIS001",
AXPWD:"adonix"
};
new wClassCaller().call(wURL,wInput);
Na prática utiliza-se as classes da classe XTENDWSVC.classCallerSpg da livraria XtendAjaxWsvc.js que facilitam o cálculo de url e a manipulação dos dados.
O parâmetro resposta está instanciado a partir da classe Ajax.response à qual se acrescentou os métodos especificos para manipular a resposta do servidor XTEND (XTENDAJAX.xtdExtendResponse).
{
//-------------------------------------------------
// Afixa o conteúdo da resposta ao formato texto (XTENDAJAX.msgBox)
xtdDisplay:function(),
//-------------------------------------------------
// Quadro que contém as mensagens de erro
xtdMsgErr:,
// Reenvia verdade se a resposta comporta um erro aplicativo X3
xtdHasX3Error:function(),
//-------------------------------------------------
// Quadro que contém as mensagens warning
xtdMsgWarning:,
//-------------------------------------------------
// Quadro que contém as mensagens de informação
xtdMsgInfo:,
//-------------------------------------------------
// Quadro que contém todas as mensagens
xtdMsgAll:,
//-------------------------------------------------
// ContenType de la réponse
xtdContentType:,
//-------------------------------------------------
// True si ContentType=text/plain
xtdIsText:function(),
//-------------------------------------------------
// True si ContentType=text/html
xtdIsHtml:function(),
//-------------------------------------------------
// True si ContentType=application/xml
xtdIsXml:function(),
//-------------------------------------------------
// True si ContentType=application/json
xtdIsJson:function(),
/*------------------ Réponse XML ------------------*/
//Avalia a resposta e reenvia um DOM XML (ver XtendAjaxDom.js)
xtdEvalXML,
//Contient le DOM XML créé par xtdEvalXML
xtdResponseXML:,
/*------------------ Reposta JSON------------------*/
//Avalia a resposta e reenvia um objeto JSON que representa a resposta
xtdEvalJSON:function(),
//Contém o objeto JSON criado por xtdEvalJSON
xtdResponseJSON:,
//Reenvia un Hash ($H) criado a partir de um quadro de chaves e de valores
xtdHash:function(aKeyArray,aValArray),
/*------- Resposta WEB SERVICE SOUS-PROGRAMME -------*/
//Avalia a resposta a um sub-programa
//-> Acrescenta os métodos específicos
xtdEvalJSONSpg:function(),
//Reenvia o valor do parâmetro AXPAR
AXPAR:function(aCode),
//Reenvia o valor do parâmetro AXPAR como um inteiro
AXPARInt:function(aCode,aDefValue),
/*------ Resposta SOUS-PROGRAMME ACCES DONNEES -------*/
//Avalia a resposta a um web service sub-programa acesso dados
//-> Acréscimo os métodos específicos
xtdEvalJSONSpgAccess:function(),
//Número de registos pedidos
askedRecords:function(),
//Número total de records
totalRecords:function(),
//Número de records reenviados
returnedRecords:function(),
//Rang (1-N) do primeiro registo
startRank:function(),
//Verdade se existem registos seguintes - Falso se paginação terminada
hasNext:function(),
/*--------- Resposta WEB SERVICE OBJET X3 ----------*/
//Avalia a resposta a um web service objet X3
//-> Acrescenta os métodos específicos
xtdEvalJSONObject:function(),
//Grupo técnico ADXTEC
adxADXTEC:function(aField),
//Timestamp de objet X3
adxTimeStamp:function(),
//UserCode X3 que modificaou um objeto em último
adxUser:function(),
}
A livraria XtendAjaxWsvc.js coloca à disposição do programador um conjunto de clase para facilitar a chamada das web services REST d'XTEND de tipo interface.
O pedido AJAX desencadeia a execução de um web service identificado pela ficha interface e trata diretamente o resultado. O servidor XTEND não faz que chamar o web service X3 e reenvia a resposta.
Todas as classes e funções são anexadas ao objeto XTENDWSVC
/*----------------- TESTES -----------------*/
//Chamada ao interface aInterfaceId com os dados aXmlData
// Afixa o resultado
testSpgXML:function(aInterfaceId,aXmlData),
//---------------------------------------------
//Chamada interface aInterfaceId com os dado aJSONData
// Afixa o resultado
testSpgJSON:function(aInterfaceId,aJSONData),
/*----------------- CALL ESTÁTICA -----------------*/
//Chamada de interface sob programa aInterfaceId com os dados aData
//As funções CallBack statiques são pasadas em parâmetro
runSpg:function(aInterfaceId,aData,onSuccess,onFailure),
//---------------------------------------------
//Idem runSpg com os dados JSON em devolução
runSpgJSON:function(aInterfaceId,aData,onSuccess,onFailure),
//---------------------------------------------
//Idem runSpg com os dados XML em retorno
runSpgXML:function(aInterfaceId,aData,onSuccess,onFailure),
/*----------------- PARAMETROS DE CHAMADA -----------------*/
//Reenvia um objeto parâmetro de base XTENDWSVC.classParam
//aJSONOptions : opções JSON (facultativo)
newParam:function (aJSONOptions),
//---------------------------------------------
//Reenvia um objeto parâmetro para a chamada de um web service objeto X3
//Classe XTENDWSVC.newParamXtdObject
//aTimeStampX3 : O timestamp X3 de objeto (facultativo)
newParamXtdObject:function (aTimeStampX3,aJSONOptions),
//---------------------------------------------
//Reenvia um objeto parâmetro para uma opção de chamada de um web service sub-programa
//Classe XTENDWSVC.classParamXtdSpg
newParamXtdSpg:function (aJSONOptions),
//---------------------------------------------
//Reenvia um objeto parâmetro para a chamada de em sub-programa "acesso aos dados"
//Classe XTENDWSVC.classParamXtdSpgAccess
//aNbLines : número máximo de registos pedidos
//aStartAt : fila do 1º registo
newParamXtdSpgAccess:function (aNbLines,aStartAt,aJSONOptions),
//---------------------------------------------
//Reenvia um objeto parâmetro para a chamada de uma lista de esquerda X3
//Classe Hash (quadro chave/valor)
//aNbLinesReturned : número de linhas pedidas
newParamQuery:function(aNbLinesReturned,aJSONOPtions),
//---------------------------------------------
//Reenvia um objeto parâmetro de tipo chave
//Classe Hash (quadro chave/valor)
newParamRead:function(aJSONOPtions),
//---------------------------------------------
//Verifica que aHash está bem parametrizada por um query
//Presença da chave "_COUNT" que contém o número de linhas pedidas
checkQueryParam:function(aHash,aReturnedCount),
Classe de bases dos parâmetros.
XTENDWSVC.classParam=Class.create({
/---------------------------------------
//aJSONOptions : Opções JSON
inicializa: function(aJSONOptions),
/---------------------------------------
//Reenvia as opções JSON
opções:function(),
/---------------------------------------
//Acrescenta um parâmetro aCode avec la valeur aCode
add:function(aCode,aValue),
/---------------------------------------
//Reenvia o valor do parâmetro aCode
get:function(aCode)
)}
Classe de parâmetros de chamada de um web service sub-programa que herda de XTENDWSVC.classParam.
XTENDWSVC.classParamXtdSpg=Class.create(XTENDWSVC.classParam,{
/---------------------------------------
//aJSONOptions : Opções JSON
inicializa: function(OptionsJSON),
/---------------------------------------
//Acrescenta um parâmetro AXPAR
addAXPAR:function(aCode,aValue)
});
Classe de parâmetros de chamada de um web service sub-programa de "tipo de dados" que herda de XTENDWSVC.classParamXtdSpgAccess
XTENDWSVC.classParamXtdSpgAccess=Class.create(XTENDWSVC.classParamXtdSpg,{
/---------------------------------------
//aJSONOptions : Options JSON
//aNbLines : número máximo de registos pedidos
//aStartAt : fila do 1º registo
//Atualiza os parâmetros '$REC_STARTAT','$TOTAL_COUNT','$RET_COUNT','$HAS_NEXT'
inicializa: function(aNbLines,aStartAt,aJSONOptions),
});
Classe de paramètre d'appel d'un web service objet X3 qui hérite de XTENDWSVC.classParam.
XTENDWSVC.classParamObject=Class.create(XTENDWSVC.classParam,{
/---------------------------------------
//aJSONOptions : Options JSON
//aTimeStampX3 : String - TimeStamp de objeto X3 (pode ser nula ou vazia)
//Acréscimo o parâmetro WW_MODSTAMP no grupo ADXTEC com o valor aTimeStamp
inicializa: function(aTimeStampX3,aJSONOptions),
});
Classe que representa as opções JSON.
//---------------------------------------
//Ativa a opção noGroups
noGroups:function(),
//---------------------------------------
//Ativa a opção noRows
noRows:function(),
//---------------------------------------
//Ativa a opção noLabels
noLabels:function(),
//---------------------------------------
//Ativa a opção noClobs
noClobs:função(),
/---------------------------------------
//Atualiza a lista dos grupos a excluir
//aValue : String or Array of string
excludeGrp:function(aValue),
//---------------------------------------
//Atualiza a lista de grupos a incluir
includeGrp:function(aValue),
//---------------------------------------
//Atualiza a lista dos campos a excluir
excludeFld:function(aValue),
//---------------------------------------
//Atualiza a lista dos campos a incluir
includeFld:function(aValue),
/*------------- EXEMPLO -------------*/
var wOpts=new XTENDWSVC.classJsonOpt().noGroups().includeFld(["SOHNUM""ITMREF","QTY"]);
Trata-se da classe de base utilizada para chamar um web service REST.
Por defeito esta classe não permite colocar vários pedidos simultaneamente e bloca as tentativas de chamadas múltiplas.
/*---------------- MÉTODOS PRINCIPAIS ----------------*/
//Construtor
//aInterfaceId : ID de interface XTEND
//Facultativo : pode passar as funções CallBack estáticos em parâmetro
//se não implementado na classe
//-> aInterfaceId,onSuccess,onFailure,onException
inicializa:function(aInterfaceId),
//-------------------------------------------------------
//Verifica se a chamada em curso e desencadeada o envio do pedido
//aUrl : Url do serviço
//aData : Dados
//aConten Tipo : ContentType
exec:function(aUrl,aData ,aContenType),
/*-------- MÉTODO CALLBACK A SOBRECARREGAR OBRIGATORIAMENTE ----------*/
// HTTP STATUS=200
// !! O método filhos deve chamar $super (resposta) para posicionar
//o indicador de chamada a falso.
onSuccess:function(resposta),
/*--------- METODO CALLBACK A SOBRECARREGAR EVENTUALMENTE ----------*/
// EXCEPTION JAVASCRIPT
//Por defeito este método afixa a excepção
// !! O método filhos deve chamar $super(request,exception,true)
// para posicionar o indicador de chamada a falso sem afixar o resultado
onException:function(request,exception,aIsOverriden),
//-------------------------------------------------------
// HTTP STATUS!=200
//Por defeito este método afixa a causa de erro
// !! O método filhos deve chamar $super(request,headerJSON,true)
// para posicionar o indicador de chamada a falso sem afixar o resultado
onFailure:function(response,headerJSON,aIsOverriden),
/*--------------------- FORMATOS --------------------*/
//Fixa aplicação/json como tipo de dados em retorno
//Tipo por defeito
setReturnJSON:function(),
//-------------------------------------------------------
//Fixa aplicação como tipo de dados em retorno
setReturnXML:function(),
//-------------------------------------------------------
//Verdade se os dados XML em retorno
returnXML:function(),
//-------------------------------------------------------
//Verdade se dados JSON em devolução
returnJSON:function(),
/*--------------------- DIVERSOS ---------------------*/
//posto efetivamente o pedido versus o servidor se sem chamada em curso
sendRequest:function(aUrl,aDataObject,aContenType)
//-------------------------------------------------------
//Reenvia o id de interface
getId:function(),
/*------------- GESTÃO CHAMADAS MÚLTIPLAS -------------*/
//A sobrecarregar se pretende desbloquar as chamadas múltiplas
//aBusy : Verdade se chamada em curso
//Reenvio para autorizar a chamada de web service
doSendRequest:function(aBusy),
//-------------------------------------------------------
//Atualização indicador de ocupação
setBusy:function(aYes),
//-------------------------------------------------------
//Verdade se chamada em curso
isBusy:function(),
Trata-se da classe de base utilizada para chamar um web service REST sub-programa
XTENDWSVC.classCallerSpg=Class.create(XTENDWSVC.classCaller,{
//-------------------------------------------------------
//Construtor
inicialização:function(aInterfaceId),
//-------------------------------------------------------
//Exécute la requête avec les données aData
//Valeur autorisée pour aData
// -null ou undefined -> this.exec()
// -String -> this.exec(aString,'text/plain')
// -Hash -> this.runFORMENCODED(aData)
// -Autre -> this.runJSON(Object.toJSON(aData))
run:function(aData),
//-------------------------------------------------------
//Exécute la requête avec les données XML aXML
runXML:function(aXML),
//-------------------------------------------------------
//Exécute la requête avec les données JSON aJSON
// JSON : String JSON ou objeto JavaScript (classe parâmetro)
runJSON:function(aJSON),
//-------------------------------------------------------
//Executa o pedido com o quadro de chaves/valores aHash
//aHash representa o conteúdo de um formulário <form>
runFORMENCODED:function(aHash),
});
O exemplo a seguir chamada de interface XTDLOGIN do estabelecimento corrente e afixa a resposta.
Call Sub-Programa
var wClassCaller=Class.create(XTENDWSVC.classCallerSpg,{
//Construtor facultativo se não há outros parâmetros que aInterfaceId
initializa:function($super,aInterfaceId){
$super(aInterfaceId);
},
//Método obrigatório para tratar a resposta
onSuccess:function(resposta){
responstae.xtdDisplay();
}
});
var wJSONOpts=new XTENDWSVC.classJsonOpt().noGroups();
var wParams=new XTENDWSVC.classParamXtdSpg(wJSONOpts);
wParams.add("AXUSERCODE","DIS001");
wParams.add("AXPWD","adonix");
new wClassCaller("XTDLOGIN").run(wParams);
Resultado
URL :
http://ecfdalbopro:28980/xtend/ajax/SOLPAIE/PAIE/FDBTEST/INT/XTDLOGIN
Contente-Tipo :
aplicação/json;charset=utf-8
X3 INFORMAÇÃO MENSAGENS :
Você está bem conectado com o código utilizador DIS001
{
"AXUSERCODE":"DIS001",
"AXPWD":"adonix",
"AXUSERPROF":"B2B",
"AX3SOL":["SOLPAIE","X3V5","XTENDV2"],
"AX3FLDR":["PAIE","X3TESTV5","DEMOFRA"],
"AX3LANG":["FRA","FRA","FRA"],
"AX3USER":["XTEND","JPJ1","OG"],
"AX3PWD":["adonix","",""],
"AXLOGCOD":["NAME","FIRSTNAME","EMAIL","PHONE"],
"AXLOGVAL":["DAL BO","Frédéric","frdal@sage.com","00102030405"],
"SHIPADR1":["Sage Lyon new","Sage MGE","Sage PARIS"],
"SHIPCITY":["LYON","Echirolles","PARIS"],
"SHIPZIP":["69443","38130","75834"]
}
Trata-se da classe de base utilizada para chamar um web service REST objet X3.
XTENDWSVC.classCallerObject=Class.create(XTENDWSVC.classCaller,{
//-------------------------------------------------------
//Construtor
inicializa:function(aInterfaceId),
//-------------------------------------------------------
//Méthode save
//aData : Dados ao formato JSON ou XML
actCreate: função (aData),
//-------------------------------------------------------
//Método Read
Hash que contém as chaves de objeto
actRead:function(aHashKeys),
//-------------------------------------------------------
//Método apagar
//aHashKeys : Hash que contém as chaves de objeto
actDelete:function(aHashKeys),
//-------------------------------------------------------
//Método modificar
//aHashKeys : Hash que contém as chaves de objeto
//aData : Dados ao formato JSON ou XML
actUpdate: função (aHashKeys,aData),
//-------------------------------------------------------
//Ação de code aCode
//aCode: Código de ação
//aHashKeys : Hash que contém as chaves de objecto
actOtherKey: function(aCode,aHashKeys),
//-------------------------------------------------------
//Ação de código aCode
//aCode : Código da ação
//aData : Dados ao formato JSON ou XML
actOtherData:function(aCode,aData),
//-------------------------------------------------------
//Ação query lista esquerda
//aHashKeys : Hash que contém as chaves para a seleção
//aReturnedCount : Opcional - Número de linhas pedidos
actQuery : function(aHashKeys,aReturnedCount),
});
O exemplo a seguir chamada de interface objeto X3 OBJAYZ (objeto AYZ) do estaebelecimento em criação e afixa a resposta.
Call Objet
var wClassCaller=Class.create(XTENDWSVC.classCallerObject,{
onSuccess:function(response){
response.xtdDisplay();
}
});
var wJSONOpts=new XTENDWSVC.classJsonOpt().noGroups();
var wParams=new XTENDWSVC.classParamObject(null,wJSONOpts);
wParams.add("TTL","Título do formulário");
wParams.add("MAICOD","frdal@sage.com");
wParams.add("CMT","Comentário");
new wClassCaller("OBJAYZ").actCreate(wParams);
Resultado
URL :
http://ecfdalbopro:28980/xtend/ajax/SOLPAIE/PAIE/FDBTEST/INT/OBJAYZ/S
Content-Type :
application/json;charset=utf-8
X3 INFORMAÇÃO MENSAGENS :
Formulário criado
{
"FRMCOD":"0902000005",
"FCYCOD":"FDBTEST",
"ZFCYCOD":"Estab.de teste fdalbo",
"TYP":"OTH",
"ZTYP":"Diversos",
"STATUT":"1",
"STATUT_LBL":"A tratar",
"TTL":"Título do formulário",
"MAICOD":"frdal@sage.com",
"CREDAT":"20090227",
"CREHEURE":"184431",
"CMT":"Comentário",
"PARCOD":[],
"PARVAL":[],
"WW_MODSTAMP":"000000000000",
"WW_MODUSER":""
}
A livraria XtendAjaxWsvc.js coloca à disposição do programador um conjunto de clase para facilitar a chamada das web services REST de tipo script serveur.
O scipt que se executa sobre o servisor XTEND acede ao contaxto da sessão via interface IXtdAjaxScriptContext.
Trata-se da classe de base utilizada para chamar um web service script serveur.
Esta classe funciona segundo o mesmo princípio que os web services interface mas os parâmetros que passam ao script servidor são livres,
São lidos via a função XTD_CTX.getHttpBody e o conteúdo está interpretado pelo script ele mesmo.
Assim, o formato da resposta reenviada está livre
É a função print que escreve directamente os dados (String) num buffer que será reenviado versus o cliente.
A função XTD_CTX.setHttpContenType permite gerar o ContentType da resposta.
Por exemplo, o script para reenviar do HTML que será inserido dinamicamente na página.
/*---------------- MÉTODOS PRINCIPAIS ----------------*/
//Construtor
//aScriptId : Caminho relativo do script por relação à raíz dos scripts
//Facultativo : pode-se passar as funções CallBack estáticas em parâmetro
// se não implementada na classe
// -> aScriptId,onSuccess,onFailure,onException
inicializa:function(aScriptId),
//-------------------------------------------------------
//Executa os scripts com aParams como parâmetro
//O conteúdo de aParams está livre e depende do script chamado
run:function(aParams),
/*-------- MÉTODO CALLBACK A SOBRECAREGAR OBRIGATORIAMENTE ----------*/
// HTTP STATUS=200
// !! O método filhos deve chamar $super (resposta) para posicionar
//o indicador de chamada a falso.
onSuccess:function(resposta),
/*--------- METODO CALLBACK A SOBRECARREGAR EVENTUALMENTE ----------*/
// EXCEPTION JAVASCRIPT
//Por defeito este método afixa a excepção
// !! O método filhos deve chamar $super(request,exception,true)
// para posicionar o indicador de chamada a falso sem afixar o resultado
onException:function(request,exception,aIsOverriden),
//-------------------------------------------------------
// HTTP STATUS!=200
//Por defeito este método afixa a causa de erro
// !! O método filhos deve chamar $super(request,headerJSON,true)
// para posicionar o indicador de chamada a falso sem afixar o resultado
onFailure:function(response,headerJSON,aIsOverriden),
/*------------- GESTÃO CHAMADAS MÚLTIPLAS -------------*/
//A sobrecarregar se pretende desbloquar as chamadas múltiplas
//aBusy : Verdade se chamada em curso
//Reenvio verdade para autorizar a chamada de web service
doSendRequest:function(aBusy),
//-------------------------------------------------------
//Atualização indicador de ocupação
setBusy:function(aYes),
//-------------------------------------------------------
//Verdade se chamada em curso
isBusy:function(),
Esta classe permite atualizar um elemento do DOM HTML (div, span...) à recepção da resposta do web service se este reenvia uma resposta HTML text/html.
XTENDSCRIPTS.classUpdater=Class.create(XTENDSCRIPTS.classCaller,{
//-------------------------------------------------------
//Construtor
//aScriptId : Path do script servidor
//aUpdateId : ID do elemento do DOM a atualizar
//aClearBefore : Verdade para apagar o conteúdo de aUpdateId antes envio do pedido
inicializa: function(aScriptId,aUpdateId,aClearBefore),
//-------------------------------------------------------
// Executa o script com aParams como parâmetro
run:function(aParams),
});
Chamada de um script que lê 2 parâmetros P1 e P2 e reenvia o conteúdo dos parâmetros sob forma de um conteúdo HTML.
Script
//Inclui da livraria utilitários
#include "libs\xtdWsvc.js"
//Leitura dos dados enviados pelo cliente
// -> Neste exemplo tratam-se de dados JSON
// -> String ao formato : {P1:"Valor P1",P2:"Valor P2"}
//A função Eval cria um objeto JavaScrit à partir da String
var wInput=eval('('+XTD_CTX.getHttpBody()+')');
//Objeto utilitário para construir a resposta HTML
var wHtml=new XTENDWSVC.classHTMLBuffer;
//reenvia-se um HTML que contém os parâmetros escritos a negrito
wHtml.append("<b>P1=").append(wInput.P1).append("</b><br>");
wHtml.append("<b>P2=").append(wInput.P2).append("</b><br>");
//Registo da resposta
print(wHtml.html());
//Atualização do ContenType
XTD_CTX.setHttpContenType("text/html");
Chamada a partir da página HTML
<Script>
função callAjaxScript(aP1,aP2){
//Parâmetros
var wParams={P1:aP1,P2:aP2};
//ajaxTest3.js é o path do script
//idReponseScript é o id da div que afixa o resultado HTML
//verdade para apagar o conteúdo da div antes chamada do script
new XTENDSCRIPTS.classUpdater("ajaxTest3.js","idReponseScript",true).run(wParams);
}
</script>
<!--Botão para desencadear a chamada-->
<input type="button" value="callAjaxScript" onClick="javascript:callAjaxScript('Hello','world');"><br>
<!--div para afixar o resultado-->
<div id="idReponseScript"></div>
Resultado do pedido