Escolar Documentos
Profissional Documentos
Cultura Documentos
1 – CONCEITOS
1.1 - O que é um WebService
Web Service é uma solução utilizada para integrar Sistemas e na comunicação entre
aplicações de plataformas diferentes. Com este recurso é possível que novas aplicações
possam ser integradas com aplicações já existentes e que Sistemas desenvolvidos em
plataformas distintas sejam compatíveis.
Os Web Services são componentes que permitem as aplicações enviar e receber dados no
formato XML. Cada aplicações pode ter sua linguagem, que será traduzida para o XML,
fazendo com que em certo ponto utilizem a mesma linguagem para comunicação.
A comunicação dos Web Services baseiam-se no protocolo SOAP (Simple Object Access
Protocol). O protocolo SOAP utiliza geralmente o HTTP para transferência das informações.
Com isto, em vez de usar HTTP para pedir uma página HTML para ser visualizada em um
navegador, o SOAP envia uma mensagem de XML através do pedido HTTP e recebe uma
resposta, se existir, através da resposta do HTTP.
Utilizando o Web Service internamente no Sistema, via Regra LSP ou via MCDebug, como
veremos mais a frente, a comunicação ocorre internamente no Sistema. Assim, quando é
efetuada uma chamada de Web Service internamente pelo Sistema, o Web Service chama
diretamente a rotina que irá efetuar o processamento, não necessitando de camadas
intermediárias para direcionar o processamento do Web Service.
A lista dos Web Services disponíveis em cada Sistema deve ser obtida no Editor de Serviços,
dentro de cada Sistema, nos caminhos abaixo:
Exemplo. com.senior.g5.co.mcm.est.estoques
Dentro dos Web Services disponíveis para uso nos Sistemas Senior temos 3 tipos de Web
Services, sendo eles:
- Web Services Padrões:
- Web Services Personalizados:
- Web Services de Terceiros
1.4.1 - Web Services Padrões
São Web Services criados ou customizados de acordo com a necessidade do Cliente. Todas
as portas de entrada e saída de informações são customizadas.
O comportamento e processamento deste tipo de Web Service é controlado via regra LSP,
programada dentro do próprio Web Service.
São Web Services disponibilizados por outros Sistemas, não Senior, e são “importados” para
o Sistema Senior. Não é possível alterar seu comportamento ou personalizar suas portas
(métodos). O Sistema Senior somente irá efetuar a chamada do Web Service sendo que o
processamento ocorrerá no outro Sistema.
2 – FUNCIONAMENTO
1– Web Service;
2– Portas de Comunicação
3– Parâmetros de Entrada e Saída
As portas de comunicação são os métodos do WebService. Ou seja, é a rotina que irá ser
executada pelo Sistema. Os parâmetros desta porta são as entradas de dados para
processamento e a saída que será devolvida após o processamento da rotina pelo Sistema.
Um Web Service pode ter mais de uma porta (método), conforme a área do WebService. O
exemplo abaixo ilustra um Web Service que possui mais de uma porta (método) para a
mesma rotina do Sistema (Pedidos).
É possível também que o Web Service possua somente parâmetros de entrada ou somente
parâmetros de saída.
Havendo somente parâmetros de entrada o Web Service não devolverá nenhuma
informação sobre o processamento. Caso houver somente parâmetros de saída, não será
necessário informar nenhuma informação para execução do Web Service, bastando somente
invocá-lo para obter o resultado.
Dentro de cada Web Service poderá haver parâmetros de entrada e saída. Alguns destes
parâmetros de entrada podem ser obrigatórios. A informação da obrigatoriedade dos
parâmetros de entrada pode ser verificada dentro do editor de Serviços. Após clicar sobre a
porta ou parâmetro tabela do Web Service será apresentada uma tabela com os parâmetros
e informações sobre o tipo e obrigatoriedade.
É importante que sejam verificados os parâmetros obrigatórios do Web Service para sua
execução correta.
2.3 - Conceito de Grid (tabela) nos Web Services
A grande vantagem no uso dos Web Services é o conceito de múltiplos registros dentro da
mesma chamada do Serviço. Ou seja, pode-se inserir uma grande quantidade de
informações distintas dentro da mesma execução, onde o Sistema irá “decompor” esta
mensagem e irá processar os vários registros enviados.
Esta diferença fica visível se comparar-mos a inclusão de um Pedido via Ação SID e via Web
Service.
- Para a inclusão de um Pedido simples via ação SID por exemplo, é necessário a execução
das seguintes ações:
SID.Ped.Gravar
SID.Ped.GravarProduto ou SID.Ped.GravarServico
SID.Ped.GravarObservacao
SID.Ped.Fechar
- Para a inclusão de um Pedido Simples via Web Service é necessário a execução do Web
Service com.senior.g5.co.mcm.ven.pedidos@GravarPedidos.Pedido
Neste caso, o parâmetro “Pedido” é do tipo tabela, onde podemos inserir vários pedidos
dentro desta tabela.
Dentro da tabela “Pedido” estão disponíveis as tabelas “Produto”, “Servico” e “Observação”.
Assim, pode-se criar uma tabela contendo vários pedidos e dentro deste pedido vários
produtos para cada pedido, conforme exemplo abaixo:
<GravarPedidos> <GravarPedidos>
<Pedido> <RespostaPedido>
Empresa: 1 Empresa: 1
Filial: 1 Filial: 1
Pedido: 1 Pedido: 1
Cliente: 10 Retorno: Inserido com Sucesso
Fecha Pedido: S <Produto>
<Produto> Seq. Item: 1
Seq. Item: 1 Pedido: 1
Pedido: 1 Retorno: OK
Produto: 1101 </Produto>
</Produto> <Produto>
<Produto> Seq. Item: 2
Seq. Item: 2 Pedido: 1
Pedido: 1 Retorno: OK
Produto: 1102 </Produto>
</Produto> </RespostaPedido>
</Pedido> <RespostaPedido>
<Pedido> Empresa: 1
Empresa: 1 Filial: 1
Filial: 1 Pedido: 2
Pedido: 2 Retorno: Pedido Inserido Parcialmente
Cliente: 20 <Produto>
Fecha Pedido: N Seq. Item: 1
<Produto> Pedido: 2
Seq. Item: 1 Retorno: OK
Pedido: 2 </Produto>
Produto: 1501 <Produto>
</Produto> Seq. Item: 2
<Produto> Pedido: 2
Seq. Item: 2 Retorno: Falta Estoque
Pedido: 2 </Produto>
Produto: 1502 </RespostaPedido>
</Produto> </GravarPedidos>
</Pedido>
</GravarPedidos>
Alguns Web Services possibilitam que sejam inseridas informações nos campos de usuário
presentes na tabela envolvida no processo.
Para verificar se o Web Service possui este recurso, deve-se verificar se o Web Service
possui uma tabela chamada “Usuario”, conforme imagem abaixo. É possível informar mais
de um campo de usuário dentro de cada tabela, inserindo assim vários registros nos
campos de usuário de uma única vez.
3 - CHAMADA DE UM WEBSERVICE PADRÃO OU
PERSONALIZADO
3.1 - Chamando um WebService via MCDEBUG
Os Sistemas Senior possuem um modo de execução chamado “Modo Depuração de Web
Services”. Este recurso possibilita executar um Web Service internamente no Sistema, sem
a necessidade de Sistemas Externos ou componentes do Middleware Senior instalado.
Exemplos:
C:\Senior\Sapiens\Sapiens.exe –MCDEBUG
C:\Senior\Regente\Regente.exe -MCDEBUG
C:\Senior\Vetorh\Rubi.exe -MCDEBUG
Ao iniciar o Sistema, estará disponível somente o Menu Diversos, conforme imagem abaixo:
Diferente da listagem dos Web Service disponível no Editor de Serviços, a lista dos Web
Services disponível via MCDebug traz a descrição do Web Service e não o seu nome.
Há também uma separação por método (porta), onde no MCDebug são listados vários Web
Services pela Descrição, mesmo estes pertencendo a mesma rotina. Exemplo:
Ao selecionar um Web Service disponível na lista, será aberta uma tela para entrada de
valores que serão enviados ao Web Service. Com isto, não há necessidade de alterar o XML
do Web Service manualmente, podendo então inserir os dados do Web Service via tela.
Campos de Usuário
Retorno da Execução
A partir da tela de entrada do Web Service é possível importar um XML previamente salvo
ou salvar os dados digitados na tela para um arquivo XML. Com isso, pode-se salvar os
dados de um teste para novo uso futuramente.
Este XML gerado pelo MCDebug é interpretado somente por este recurso. Este XML não
possui o envelope SOAP, necessário para a comunicação do Web Service entre Sistemas.
Devido a este comportamento, não é possível importar um XML gerado pelo soapUI ou
outro Sistema por exemplo, diretamente para o editor do MCDebug.
O MCDebug permite que sejam depuradas as regras ligadas as rotinas dos Web Services,
quando a execução é efetuada em modo Local. Este meio de execução permite tal
funcionalidade, pois pode-se abrir telas de interação com o usuário. Os demais meios de
execução não possibilitam tal funcionalidade, visto que não é possível a abertura de telas do
Sistema.
Retorno da Execução
Os modos de execução de Web Service via regra LSP seguem o mesmo padrão utilizado
via MCDebug, porém são tratados por numeração na regra, conforme abaixo:
1 – Local
2 – Síncrono
3 – Assíncrono
4 - Agendado
Caso a variável “ModoExecucao” não seja declarada na execução do Web Service via regra
LSP, por padrão o Web Service será executado Localmente.
Nesta situação, executando o Web Service localmente na regra LSP o Web Service terá o
mesmo comportamento de uma função de programador, sendo executado diretamente no
mesmo aplicativo que está executando a regra.
Após a execução do Web Service em modo Local ou Síncrono, é possível obter os dados de
retorno da execução do Web Service e os dados de retorno das tabelas, quando disponíveis.
O retorno das informações geralmente ocorre em uma tabela. Com isso, é necessário ler
os dados das linhas desta tabela para obter o retorno de cada linha da tabela. Caso
contrário não será possível verificar o retorno de todos os Itens da tabela e verificar
possíveis problemas.
Abaixo há um exemplo de regra para obter o retorno de cada linha das tabelas de retorno
da tabela de Pedido e Produto.
iQtdPed = 0;
enquanto (iQtdPed < iQtdLinhasRetornoPedidos)
inicio
@posiciona no primeiro registro da tabela de retorno@
SrvPedido.RespostaPedido.LinhaAtual = iQtdPed;
iQtdPro = 0;
enquanto (iQtdPro < iQtdLinhasRetornoProdutos)
inicio Retorno da tabela de
SrvPedido.RespostaPedido.GridPro.LinhaAtual = iQtdPro; Produtos do Pedido
aSeqIpd = SrvPedido.RespostaPedido.GridPro.SeqIpd;
aRetObs = SrvPedido.RespostaPedido.GridPro.Retorno;
iQtdPro = iQtdPro + 1;
fim;
iQtdPed = iQtdPed + 1;
fim;
dDatEmi = CodData(24,01,2013);
dDatEnt = CodData(24,01,2013);
dVctOri = CodData(01,02,2013);
dVctPro = CodData(01,02,2013);
dDatPpt = CodData(01,02,2013);
SrvGerCtaRec.EntradaTitulos.CriarLinha();
SrvGerCtaRec.EntradaTitulos.CodFil = 1; @ Codigo da filial @
SrvGerCtaRec.EntradaTitulos.NumTit = "TIT001"; @ Número do título a receber @
SrvGerCtaRec.EntradaTitulos.CodTpt = "DM"; @ Código do tipo de título a receber @
SrvGerCtaRec.EntradaTitulos.CodTns = "90300"; @ Código da transação que gerou o título a receber @
SrvGerCtaRec.EntradaTitulos.DatEmi = dDatEmi; @ Data de emissão do título a receber @
SrvGerCtaRec.EntradaTitulos.DatEnt = dDatEnt; @ Data de entrada do título a receber @
SrvGerCtaRec.EntradaTitulos.CodCli = 1; @ Código do cliente do título a receber @
SrvGerCtaRec.EntradaTitulos.CodRep = 1; @ Código do representante do título a receber @
SrvGerCtaRec.EntradaTitulos.VctOri = dVctOri; @ Data do vencimento @
SrvGerCtaRec.EntradaTitulos.VctPro = dVctPro; @ Data do vencimento Prorrogado @
SrvGerCtaRec.EntradaTitulos.VlrOri = 100; @ Valor original do título a receber @
SrvGerCtaRec.EntradaTitulos.CodFpg = 001; @ Código da forma de pagamento @
SrvGerCtaRec.EntradaTitulos.DatPpt = dDatPpt; @ Data do provável pagamento @
SrvGerCtaRec.EntradaTitulos.CodPor = "9999"; @ Código do portador do título @
SrvGerCtaRec.EntradaTitulos.CodCrt = "99"; @ Código da carteira do título a receber @
SrvGerCtaRec.EntradaTitulos.CodMoe = "01"; @ Código da moeda @
SrvGerCtaRec.EntradaTitulos.CriarLinha();
SrvGerCtaRec.EntradaTitulos.CodFil = 1; @ Codigo da filial @
SrvGerCtaRec.EntradaTitulos.NumTit = "TIT002"; @ Número do título a receber @
SrvGerCtaRec.EntradaTitulos.CodTpt = "DM"; @ Código do tipo de título a receber @
SrvGerCtaRec.EntradaTitulos.CodTns = "90300"; @ Código da transação que gerou o título a receber @
SrvGerCtaRec.EntradaTitulos.DatEmi = dDatEmi; @ Data de emissão do título a receber @
SrvGerCtaRec.EntradaTitulos.DatEnt = dDatEnt; @ Data de entrada do título a receber @
SrvGerCtaRec.EntradaTitulos.CodCli = 1; @ Código do cliente do título a receber @
SrvGerCtaRec.EntradaTitulos.CodRep = 1; @ Código do representante do título a receber @
SrvGerCtaRec.EntradaTitulos.VctOri = dVctOri; @ Data do vencimento @
SrvGerCtaRec.EntradaTitulos.VctPro = dVctPro; @ Data do vencimento Prorrogado @
SrvGerCtaRec.EntradaTitulos.VlrOri = 100; @ Valor original do título a receber @
SrvGerCtaRec.EntradaTitulos.CodFpg = 001; @ Código da forma de pagamento @
SrvGerCtaRec.EntradaTitulos.DatPpt = dDatPpt; @ Data do provável pagamento @
SrvGerCtaRec.EntradaTitulos.CodPor = "9999"; @ Código do portador do título @
SrvGerCtaRec.EntradaTitulos.CodCrt = "99"; @ Código da carteira do título a receber @
SrvGerCtaRec.EntradaTitulos.CodMoe = "01"; @ Código da moeda @
SrvGerCtaRec.ModoExecucao = 1;
SrvGerCtaRec.Executar();
nQtdLin = SrvGerCtaRec.GridResult.QtdLinhas;
}
3.3 - Chamando um WebService via Sistema Externo
(soapUI)
É possível chamar um Web Service padrão do Sistema ou Personalizado a partir de
Sistemas de Terceiros.
Isto é possível ao publicar os Web Services no Servidor Glassfish (deploy), onde este irá
disponibilizar os Web Services para outros Sistemas, criando uma “ponte” entre os Sistemas
de Terceiros e os Sistemas Senior. Esta ponde pode ser chamada de “Registrador”.
Assim, temos o WSDL como uma “capa” das definições do Web Service e o XSD com todas
as informações detalhadas sobre o Web Service.
Basicamente, quando o cliente deseja enviar uma mensagem para um determinado Web
Service, ele obtém a descrição do serviço (através da localização do respectivo documento
WSDL), e em seguida constrói a mensagem, passando todos os parâmetros de acordo com
a definição encontrada no documento.
Em seguida, a mensagem é enviada para o endereço onde o serviço está localizado, a fim
de que possa ser processada. O Web Service, quando recebe esta mensagem valida-a
conforme as informações contidas no documento WSDL.
À partir de então, o serviço remoto sabe como tratar a mensagem, sabe como processá-la
(possivelmente enviando-a para outro programa) e como montar a resposta ao cliente.
Para os Web Services padrões Senior ou Personalizados, o WSDL pode ser obtido no
endereço do Web Service, adicionando o parâmetro ?WSDL no final do endereço.
Exemplo:
http://servidor:9090/g5-senior-services/sapiens/Synccom_senior_g5_co_mcm_ven_pedidos?wsdl
Após obter o endereço do WSDL do Web Service, será necessário criar um novo projeto
dentro do soapUI. O soapUI irá “ler” as definições contidas no WSDL e no XSD do Web
Service para montar a chamada do Serviço e disponibilizar os campos do Web Service em
forma de XML na tela do soapUI.
A partir deste momento é possível inserir as informações necessárias para execução do Web
Service via Middleware Senior.
3.3.5 - Verificando os parâmetros do WebService
Com a importação do WSDL do Web Service, o SoapUI irá importar todos os parâmetros de
entrada da porta selecionada.
Importante: Não há como importar somente os parâmetros obrigatórios. Caso não for
necessário utilizar determinado parâmetro, deve-se deixar com a informação original, sem
alteração.
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:GravarClientesResponse xmlns:ns2="http://services.senior.com.br">
<result>
<erroExecucao xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<mensagemRetorno>Processado com Sucesso.</mensagemRetorno>
<retornosClientes>
<cgcCpf>0</cgcCpf>
<codCli>0</codCli>
<codFor>9</codFor>
<ideExt>?</ideExt>
<retorno>Informação do tipo de cliente requerida.</retorno>
</retornosClientes>
<tipoRetorno>1</tipoRetorno>
</result>
</ns2:GravarClientesResponse>
</S:Body>
</S:Envelope>
mensagemRetorno: Mensagem de retorno do processamento do Web Service.
retorno: Mensagem de retorno do processamento do item do Web Service.
tipoRetorno: 1 = Processado, 2 = Erro na Solicitação
<soapenv:Header/>
<soapenv:Body>
<ser:AuthenticateJAAS>
<user> </user>
<password> </password>
<encryption></encryption>
<parameters>
<pmUserName> </pmUserName>
<pmUserPassword> </pmUserPassword>
</parameters>
</ser:AuthenticateJAAS>
</soapenv:Body>
<soapenv:Header/>
<soapenv:Body>
<ser:AuthenticateJAAS>
<user>senior</user>
<password>senior</password>
<encryption>0</encryption>
<parameters>
<pmUserName>Usuario</pmUserName>
<pmuserpassword>Senha</pmuserpassword>
</parameters>
</ser:AuthenticateJAAS>
</soapenv:Body>
<soapenv:Header/>
<soapenv:Body>
<ser:AuthenticateJAAS>
<user>senior</user>
<password>senior</password>
<encryption>0</encryption>
<parameters>
<pmUserName>Usuario</pmUserName>
</parameters>
</ser:AuthenticateJAAS>
</soapenv:Body>
Os Web Services executados por outras formas que não seja via regra LSP em modo local,
não permitem a utilização da função “Mensagem(Retorna,xxx)” nas regras ligadas a rotina
do Web Service.
Regra XXX: Não é permitido executar nas regras o comando "Mensagem" com "Retorna"
quando a instância da aplicação é de serviço.
Constatamos em alguns situações que a rotina do Sistema tenta abrir uma “tela” do
Sistema quando é executada a rotina do Web Service. Por exemplo, ao executar um Web
Service ou ação SID via Web Service, é gerada uma tela com uma barra de progresso.
Nesta situação, quando o Web Service ou ação SID via Web Service for executada via
Middleware Senior, a sua execução será “abortada” não chegando a ser processado pelo
ERP. Isto pode ocorrer quando utiliza-se um Web Service personalizado e algum Web
Service ou ação SID na regra LSP do Web Service.
Em alguns Web Services, pode haver um campo do tipo Data que é opcional. Nesta
situação, se não for informada nenhuma informação para este campo, o mesmo deve ser
retirado do XML do Web Service.
Isto é necessário pois o SoapUI adiciona o valor ? para todos os campos, fazendo com que
ele se torne “em branco” quando enviado para exeução.
Porém para os campos do tipo data, há uma validação desta informação, retornando que a
data não está no formato correto.
4 – Provedores de Terceiros
4.1 - Identificando a URL do provedor e o contexto
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
<s:element name="FahrenheitToCelsius">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Fahrenheit" type="s:string"/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="FahrenheitToCelsiusResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="FahrenheitToCelsiusResult"
type="s:string"/>
</s:sequence>
</s:complexType>
</s:element>
</s:schema>
</wsdl:types>
entrada = msg.entrada;
Cur_E085CLI.FecharCursor();
No exemplo acima, “msg” é o nome da porta do Web Service. Sempre que for necessário ler ou devolver um dado
para um dos parâmetros do Web Service, deve-se inserir o nome da porta antes do parâmetro.