Beruflich Dokumente
Kultur Dokumente
Proibida a reproduo total ou parcial, bem como a armazenagem em sistema de recuperao e a transmisso, de qualquer
modo ou por qualquer outro meio, seja este eletrnico, mecnico, de fotocpia, de gravao, ou outros, sem prvia autorizao
por escrito da proprietria.
O desrespeito a essa proibio configura em apropriao indevida dos direitos autorais e patrimoniais da TOTVS.
Conforme artigos 122 e 130 da LEI no. 5.988 de 14 de Dezembro de 1973.
Programao ADVPL
WebService
Protheus Verso 12
Programao ADVPL WebService
Sumrio
1. Objetivo........................................................................................................................................... 5
2. Introduo aos WEBSERVICES ..................................................................................................... 5
2.1. O QUE UM WEBSERVICE WSDL........................................................................................ 5
2.2. O QUE UM XML ................................................................................................................... 6
2.3. O QUE SOAP ....................................................................................................................... 8
2.4. O QUE UDDI ........................................................................................................................ 8
3. O Servidor Protheus como um servidor WEBSERVICES ............................................................... 9
4. Configurando servidor de WEBSERVICES .................................................................................... 9
5. Mdulos Web .................................................................................................................................. 13
6. Explicando o INI do WEBSERVICES.............................................................................................. 21
7. WSINDEX - ndice de Servios ....................................................................................................... 24
7.1. Processamento de Funes..................................................................................................... 26
8. Codificando o servio...................................................................................................................... 26
9. Testando o servio ......................................................................................................................... 28
10. Consumo de servios ................................................................................................................... 35
11. TWsdlManager ............................................................................................................................. 36
12. Criando um WEBSERVICE de Gravao ..................................................................................... 38
12.1. Definio de estrutura ............................................................................................................ 38
13. APNDICES ................................................................................................................................. 59
13.1. GUIA DE REFERNCIA RPIDA: Funes e Erros apresentado pelo WebServices ........... 59
14. GETWSCERROR - Recuperao de informaes ....................................................................... 59
15. WSCERR000 / WSDL no suportado. Existe mais de um servio declarado ............................... 60
16. WSCERR001 / No h SOAP:BINDINGS para a gerao do Servio ......................................... 60
17. WSCERR003 / [XXX / YYY] Enumeration no suportado ............................................................. 60
18. WSCERR004 / NO IMPLEMENTADO ( 001<X> / <N> / WSDLTYPE_NAME ) ......................... 61
19. WSCERR006 / WSDL invlido ou no suportado ......................................................................... 61
20. WSCERR007 / WSDL invlido ou no suportado ......................................................................... 61
21. WSCERR008 / Retorno NULLPARAM invlido ............................................................................ 61
22. WSCERR009 / INTERNAL ERROR (X)........................................................................................ 62
23. WSCERR010/[STRUCT_TYPE]Estrutura / Tipo incompleto ........................................................ 62
24. WSCERR011 / Retorno NULLPARAM invlido ............................................................................ 62
25. WSCERR012 / INTERNAL ERROR (X)........................................................................................ 62
26. WSCERR013 / [SOAP_TYPE] UNEXPECTED TYPE .................................................................. 63
27. WSCERR014 / INVALID NULLPARAM INIT ................................................................................ 63
28. WSCERR015 / Node [XXX] as [YYY] on SOAP Response not found........................................... 63
29. WSCERR016 / Requisio HTTPS no suportada neste Build. [XXX] ......................................... 63
30. WSCERR018 / HTTP[S] Requisio retornou [EMPTY] ............................................................... 64
2 Verso 12
Programao ADVPL WebService
Verso 12 3
Programao ADVPL WebService
69. WSCERR059 / Invalid XML-Soap Server Response: soap-body not found .................................. 75
70. WSCERR060 / Invalid XML-Soap Server Response: soap-body envelope empty ....................... 75
71. WSCERR061 / Invalid XML-Soap Server Response: Invalid soap-body [BODY] object
as valtype [TYPE] ............................................................................................................................... 75
72. WSCERR062 / Invalid XML-Soap Server Response: Unable to determine Soap Prefix
of Envelope [SOAP_ENV]................................................................................................................... 75
73. WSCERR063 / Argument error : Missing field [NODE] as [TYPE] ................................................ 76
74. WSCERR064 / Invalid Content-Type return (HTTP_HEAD) from <URL> ..................................... 76
75. WSCERR065 / EMPTY Content-Type return (HEADER) from <URL> ......................................... 76
76. WSCERR066 / Invalid INVALID WSDL Content-Type (HTTP_HEAD) from <URL> ..................... 77
77. WSCERR067 / EMPTY WSDL Content-Type (HTTP_HEAD) from <URL> .................................. 77
78. WSCERR068 / NOT XML SOURCE from <URL> ........................................................................ 77
79. WSCERR069 / BYREF [PARAM] WITH NO INPUT ARGUMENT : UNSUPPORTED
WEBSERVICE .................................................................................................................................... 78
80. WSCERR070 / Requisio HTTPS no suportada neste BUILD
[PROTHEUS_BUILD] ......................................................................................................................... 78
81. WSCERR071 / INVALID HTTP HEADER (HTTPHEAD) from <URL> .......................................... 78
82. WSCERR072 / HTTP REQUEST ERROR (HEADER) from <URL> ............................................. 78
83. WSCERR073 / Build (BUILD) XML Internal Error ......................................................................... 79
84. Nomenclatura dos Servios .......................................................................................................... 79
85. Nomenclatura de Estruturas ......................................................................................................... 79
86. Nomenclatura de Dados ( Campos )............................................................................................. 80
86.1. Tipos de Dados Bsicos......................................................................................................... 80
87. Mtodos (Aes) ........................................................................................................................... 81
4 Verso 12
Programao ADVPL WebService
1. Objetivo
Ao final do curso, o treinando dever ter desenvolvido os seguintes conceitos, habilidades e atitudes:
A) Conceitos:
estruturas para implementao aplicaes ADVPL WEBSERVICES
introduo as tcnicas de programao voltadas a mltiplos servios baseados na estrutura de
programao ADVPL
introduo aos conceitos de inserir, alterar, excluir e apresentao dos dados via protocolo SOAP
B) Habilidades e tcnicas:
desenvolvimento de aplicaes voltadas ao ERP/WEBSERVICES Protheus
anlise de fontes de mdia complexidade
desenvolvimento de um servio WebServices e seu Client
Para as empresas, os Web services podem trazer agilidade para os processos e eficincia na comunicao entre
cadeias de produo ou de logstica. Toda e qualquer comunicao entre sistemas passa a ser dinmica e
principalmente segura, pois no h interveno humana.
Essencialmente, o Web Service faz com que os recursos da aplicao do software estejam disponveis sobre a rede de
uma forma normalizada. Outras tecnologias fazem a mesma coisa, como, por exemplo, os browsers da Internet acedem
s pginas Web disponveis usando por norma as tecnologias da Internet, HTTP e HTML. No entanto, estas tecnologias
no so bem sucedidas na comunicao e integrao de aplicaes. Existe uma grande motivao sobre a tecnologia
Web Service pois possibilita que diferentes aplicaes comuniquem-se e utilizem recursos diferentes.
Utilizando a tecnologia Web Service, uma aplicao pode invocar outra para efetuar tarefas simples ou complexas,
mesmo que as duas aplicaes estejam em diferentes sistemas e escritas em linguagens diferentes. Por outras
palavras, os Web Services fazem com que os seus recursos estejam disponveis para que qualquer aplicao cliente
possa operar e extrair os recursos fornecidos.
Os Web Services so identificados por um URI (Uniform Resource Identifier), descritos e definidos usando XML
(Extensible Markup Language). Um dos motivos que tornam os Web Services atrativos o fato deste modelo ser
baseado em tecnologias padro, em particular XML e HTTP (Hypertext Transfer Protocol). Os Web Services so
utilizados para disponibilizar servios interativos na Web, podendo ser acessados por outras aplicaes usando, por
exemplo, o protocolo SOAP (Simple Object Access Protocol).
Verso 12 5
Programao ADVPL WebService
O objetivo dos Web Services a comunicao de aplicaes atravs da Internet. Esta comunicao realizada com
intuito de facilitar a EAI (Enterprise Application Integration) que significa a integrao das aplicaes de uma empresa,
ou seja, interoperabilidade entre a informao que circula numa organizao nas diferentes aplicaes como, por
exemplo, o comrcio electrnico com os seus clientes e seus fornecedores. Esta interao constitui o sistema de
informao de uma empresa. E, para alm da interoperabilidade entre as aplicaes, a EAI permite definir um workflow
entre as aplicaes e pode constituir uma alternativa aos ERPs (Enterprise Resource Planning). Com um workflow,
possvel otimizar e controlar processos e tarefas de uma determinada organizao.
Tecnologias
As bases para a construo de um Web service so os padres XML e SOAP. O transporte dos dados realizado
normalmente via protocolo HTTP ou HTTPS para conexes seguras (o padro no determina o protocolo de
transporte). Os dados so transferidos no formato XML, encapsulados pelo protocolo SOAP.
um dos subtipos da SGML (acrnimo de Standard Generalized Markup Language ou Linguagem Padronizada de
Marcao Genrica) capaz de descrever diversos tipos de dados. Seu propsito principal a facilidade de
compartilhamento de informaes atravs da internet.
Entre linguagens baseadas em XML incluem-se XHTML (formato para pginas Web), RDF, SDMX, SMIL, MathML
(formato para expresses matemticas), NCL, XBRL, XSIL e SVG (formato grfico vetorial). A principal caracterstica do
XML, de criar uma infraestrutura nica para diversas linguagens, que linguagens desconhecidas e de pouco uso
tambm podem ser definidas sem maior trabalho e sem necessidade de submisso aos comits de padronizao.
Em meados da dcada de 1990, o World Wide Web Consortium (W3C) comeou a trabalhar em uma linguagem de
marcao que combinasse a flexibilidade da SGML com a simplicidade da HTML. O princpio do projeto era criar uma
linguagem que pudesse ser lida por software, e integrar-se com as demais linguagens. Sua filosofia seria composta por
vrios princpios importantes:
O XML um formato para a criao de documentos com dados organizados de forma hierrquica, como se v,
frequentemente, em documentos de texto formatados, imagens vetoriais ou bancos de dados.
Pela sua portabilidade, j que um formato que no depende das plataformas de hardware ou de software, um banco
de dados pode, atravs de uma aplicao, escrever em um arquivo XML, e um outro banco distinto pode ler ento estes
mesmos dados.
6 Verso 12
Programao ADVPL WebService
Vantagens e desvantagens
Com relao aos outros "formatos universais para intercmbio de dados" j propostos e experimentados, o XML
apresenta diversas vantagens tcnicas, mas so as vantagens no-tcnicas que o tornam um tpico de to grande
importncia:
um padro "de fato" e formal: em um universo onde cada desenvolvedor e cada fabricante tm a liberdade
de criar e impor seu prprio formato, a aceitao do XML tem sido vista como o seu maior trunfo.
Tem sua origem em uma das instituies de padronizao mais abertas e dinmicas, o W3C.
Vantagens tcnicas
Suporta Unicode, permitindo que a maior parte da informao codificada em linguagem humana possa ser
comunicada
auto documentado (DTDs e XML Schemas): o prprio formato descreve a sua estrutura e nomes de campos,
assim como valores vlidos
A sintaxe restrita e requerimentos de parsing tornam os algoritmos de anlise mais eficientes e consistentes
editvel, devido popularidade do XML nos dias de hoje, com diferentes nveis de automao, em qualquer
ambiente:
Sem automao: editores txt antigos, tais como vi
Com recurso automtico de destaque: a maior parte dos editores txt modernos oferece recursos para
destaque de XML (distino visual entre tag, atributo e contedo)
Com recursos de visualizao e controle (folding) da hierarquia: editores txt mais especializados e editores
simples acoplados a navegadores
Com recursos de validao e anlise sinttica: ferramentas um pouco mais sofisticadas, orientadas a
programadores, tais como as IDEs, ou orientadas a contedo, tais como editores XHTML, ambos vem se
adaptando para lidar com outros formatos XML, interpretando DTD, XSLT ou XML Schema
Desvantagens tcnicas
As desvantagens em geral se restringem s aplicaes que no demandam maior complexidade, tais como vetores,
listas associativas (chave-valor) e informaes relativas configurao, em que o bom senso estabelece a melhor
escolha (entre o XML ou um formato menos popular).
O "XML simples" pode ser substitudo por formatos mais simples, como properties, YAML, JSON e Simple Outline XML.
Verso 12 7
Programao ADVPL WebService
Os principais critrios para se avaliar a demanda por um formato mais simples so:
Editabilidade txt: o arquivo "XML simples" (como se pode ver nos exemplos acima) pode ser bem pouco
intuitivo, dificultando sua edio com editores txt por pessoas leigas, mais ainda no caso de volume de dados
muito grandes, onde o XML pode sequer ser facilmente editvel por pessoas experientes
O formato properties, por exemplo, mais fcil de ser editado por leigos, por ser apenas uma lista de itens do tipo
chave-valor, e o JSON um exemplo de um formato mais prtico e rpido em contexto Javascript.
Ele se baseia na Linguagem de Marcao Extensvel (XML) para seu formato de mensagem, e normalmente baseia-se
em outros protocolos da Camada de aplicao, mais notavelmente em Chamada de Procedimento Remoto (RPC) e
Protocolo de Transferncia de Hipertexto (HTTP), para negociao e transmisso de mensagens.
SOAP pode formar a camada base de uma pilha de protocolos de web services, fornecendo um framework de
mensagens bsico sob o qual os servios podem ser construdos.
Este protocolo baseado em XML consiste de trs partes: um envelope, que define o que est na mensagem e como
process-la, um conjunto de regras codificadas para expressar instncias dos tipos de dados definidos na aplicao e
uma conveno para representar chamadas de procedimentos e respostas.
Sua especificao define um framework que prov maneiras para se construir mensagens que podem trafegar atravs
de diversos protocolos e que foi especificado de forma a ser independente de qualquer modelo de programao ou
outra implementao especfica. Por no se tratar de um protocolo de acesso a objetos, o acrnimo no mais
utilizado.
Geralmente servidores SOAP so implementados utilizando-se servidores HTTP, embora isto no seja uma restrio
para funcionamento do protocolo. As mensagens SOAP so documentos XML que aderem a uma especificao
fornecida pelo rgo W3C.
Um servio de registro UDDI um Web Service que gerencia informao sobre provedores, implementaes e
metadados de servios. Provedores de servios podem utilizar UDDI para publicar os servios que eles oferecem.
8 Verso 12
Programao ADVPL WebService
Usurios de servios podem usar UDDI para descobrir servios que lhes interessem e obter os metadados necessrios
para utilizar esses servios.
O Protheus, a partir da verso AP7, possui ferramentas nativas e integradas com a LIB de Infraestrutura do ERP, para
desenvolvimento de aplicaes 'Cliente' e 'Server', utilizando a tecnologia dos Web Services.
Para melhor compreenso do assunto, os tpicos relacionados a ambos foram didaticamente separados em Aplicaes
Server e Aplicaes Cliente, respectivamente. Nos tpicos 'Comandos' e 'Funes', so abordadas respectivamente as
diretivas e funes da Lib de Infraestrutura do ERP disponibilizadas para o desenvolvimento de ambas as aplicaes,
Cliente e Server.
No tpico 'Exemplos AdvPL', so demonstrados os exemplos 'atmicos' de uso das funes e comandos.
A habilitao do servio de HTTP necessria para a instalao dos mdulos WebService. Durante a instalao de um
mdulo WebService, caso o servio de HTTP no esteja habilitado, esta operao ser executada automaticamente.
Ao expandir o tpico "Servidor HTTP", so mostrados os itens HTTP, HTTPS e FTP, que permitem a edio
independentemente das configuraes de cada um destes protocolos. Para cada um deles, so permitidas as
operaes de edio e excluso da respectiva configurao.
Verso 12 9
Programao ADVPL WebService
3. No tpico "Servidor HTTP", posicionado o cursor sobre o item "HTTP" e clique em - Editar Configurao, nas
Aes Relacionadas.
10 Verso 12
Programao ADVPL WebService
Ser apresentada uma nica janela, contendo as configuraes padres atuais para o servio de http.
Protocolo Habilitado
Atravs deste campo possvel desabilitar a utilizao do protocolo http, sem deletar as configuraes atuais desta
seo.
Nome da Instncia
Este campo no est disponvel para edio. Caso esteja preenchido, informa que um mdulo Web foi instalado no host
HTTP [default]; neste caso, no possvel alterar as informaes de path, porta de conexo, ambiente e processo de
resposta.
Se for necessrio alterar as informaes de configurao padro do protocolo, deve-se utilizar o assistente de edio
de Mdulos Web, editando a instncia que est utilizando a seo http [default].
Path de Arquivos
Especifica o diretrio raiz a ser utilizado pelo protocolo "HTTP" para o acesso a arquivos estticos e imagens.
Porta de Conexo
Verso 12 11
Programao ADVPL WebService
Ambiente
Permite selecionar um ambiente (Environment) neste ByYou Application Server para atender s solicitaes de
processamento de links ".apl".
Processo de Resposta
Permite selecionar um processo WEB/WEBEX configurado neste ByYou Application Server para atender s solicitaes
de processamento de links ".apw".
Nestas configuraes, possvel especificar um nmero mnimo e mximo de processos internos referentes ao servio
de HTTP. Estes processos internos so utilizados para o atendimento simultneo das requisies de contedo esttico,
arquivos, imagens, e demais arquivos disponveis a partir da pasta definida em Path de Arquivos, atravs deste
protocolo (*).
Caso o host HTTP [default] esteja sendo utilizado com um processo de resposta que suporte a funcionalidade de
Upload de arquivos via HTTP, atravs desta chave, possvel configurar a partir de qual diretrio sero gravados os
arquivos enviados via http (relativo ao diretrio raiz do ambiente utilizado pelo processo de resposta).
Ao configurar um ou mais mdulos Web que utilizem sesses de usurio atravs de um Processo WEBEX, possvel
definir qual ser o tempo de permanncia em inatividade em memria das variveis de sesses utilizadas pelos
usurios do mdulo web.
Caso seja no especificado, o valor padro equivalente a 3600 segundos (uma hora).
(*) Vale ressaltar que uma thread HTTP no possui, necessariamente, ligao implcita com uma Thread AdvPL. Um
Web Browser, quando solicita um arquivo HTML ou uma imagem, estabelece uma conexo HTTP com o ByYou
Application Server, para receber o dado solicitado. Quando o browse recebe a informao desejada, fecha esta
conexo, mantendo a Thread HTTP do Protheus disponvel para atender a outras requisies HTTP, oriundas deste ou
de outro Web Browser.
12 Verso 12
Programao ADVPL WebService
Ao confirmar a gravao, o arquivo de configuraes do ByYou Application Server (appserver.ini) ser atualizado e o
Assistente ser reiniciado, apresentando a tela principal do Wizard.
5. Mdulos Web
Neste tpico, possvel instalar, configurar e excluir as configuraes e arquivos adicionais pertinentes aos mdulos
Web disponibilizados pelo Sistema.
DW - Data Warehouse
Verso 12 13
Programao ADVPL WebService
3. Posicione com o mouse sobre o tpico Mdulos Web na rvore de tpicos, e clique em Novo Mdulo , nas
Aes Relacionadas.
14 Verso 12
Programao ADVPL WebService
Mdulo Web
Selecione o mdulo Web que deve ser instalado. Para instalao do mdulo PP - Portal Protheus, GPR - Gesto de
Pesquisa e Resultado e GAC - Gesto de Acervos, necessria a instalao prvia do mdulo Web Services.
Nome da Instncia
Informe o nome para identificao desta configurao do mdulo Web; no utilize caracteres acentuados ou espaos.
Este nome ser utilizado para individualizar as configuraes das instalaes do mdulo Web, assim, se a empresa
necessita aplicar diferentes configuraes para um mesmo mdulo Web, possvel instal-lo sob uma nova instncia.
Exemplo: Na instalao do mdulo GE - Educacional, cada unidade educacional pode utilizar um conjunto diferente de
imagens para apresentao do seu site ou, ainda, um environment diferente no Server Protheus da verso
correspondente; para isto, ser necessrio criar diferentes instncias.
Informe o diretrio para instalao das imagens e dos demais arquivos (. css,.jar,.htm, etc.) deste mdulo, que sero
utilizados para apresentao no browser.
Este diretrio ser criado abaixo do diretrio raiz (RootPath) do Ambiente (environment) selecionado para a instalao.
Para cada instalao de mdulo Web, dever ser especificado um diretrio diferente, iniciando com o sinal de "\" (barra
inversa).
Verso 12 15
Programao ADVPL WebService
Environment
Selecione o environment (ambiente) que ser utilizado para execuo do mdulo. So relacionados todos os ambientes
disponveis no Server ativo.
Caso esta configurao seja selecionada, os processos WEB / WEBEX criados para esta configurao de mdulo sero
automaticamente inseridos na configurao OnStart do ByYou Application Server.
Este campo somente exibido na instalao do mdulo WS - WebServices Protheus; neste caso, deve ser preenchido
com a URL utilizada na instalao do mdulo Web Services, precedido por "HTTP://".
O Assistente ir consistir as informaes fornecidas e determinar se o ambiente est apto para instalao do mdulo.
Deve-se observar que para instalao dos mdulos Web, necessrio que os pacotes de instalao dos arquivos Web
(. MZP) estejam disponveis na pasta "SYSTEMLOAD" localizada abaixo do diretrio raiz.
(RootPath) do Ambiente (environment). Caso os pacotes no sejam localizados, ser apresentada uma janela de
advertncia.
16 Verso 12
Programao ADVPL WebService
A instalao poder prosseguir; no entanto, os arquivos Web no sero descompactados, sendo apenas atualizada a
configurao do servidor. Em seguida, ser apresentada a janela "Configurao de Host x Empresas/Filiais".
Host: Informe o endereo Web a partir do qual o mdulo ser acessado, por meio de um browser.
Exemplos:
www.nomedosite.com.br (para um ambiente Internet)
"nomedoservidor (para um ambiente Intranet).
Pode-se, adicionalmente, informar um diretrio virtual aps o Host, separando-os por uma barra /. Isto permite que
seja instalado, no mesmo host, mais de um mdulo Web.
Verso 12 17
Programao ADVPL WebService
Exemplos:
nomedoservidor/ws (para webservices)
nomedoservidor/pp (para o Portal)
Vale ressaltar que possvel especificar um nome de host, no sendo obrigatoriamente o nome da estao servidor,
desde que o nome especificado esteja registrado em um servidor de DNS (que relaciona um nome de host ao IP do
equipamento servidor) e visvel no mbito do parque de mquinas-cliente da aplicao Web.
Selecione as Empresa/Filiais
Na rea "Seleo Empresas/Filiais", selecione a empresa/filial para a qual est sendo configurado este host.
Se a instalao for referente aos mdulos BSC, PP e WPS, estar disponvel apenas a opo "Todas as Empresas".
7. Aps informar o Host e selecionar um item da rea de Seleo Empresa/Filiais, clique em "Relacionar".
A amarrao do host informado com este item ser apresentada na janela "Relacionamentos".
possvel criar diversos relacionamentos, o Assistente, automaticamente, ir criticar as amarraes, de acordo com as
caractersticas operacionais do mdulo em instalao.
Exemplo: O mdulo de WebServices no permite amarrar um mesmo host a mais de uma empresa/filial; j para o
mdulo TCF, esta amarrao possvel.
18 Verso 12
Programao ADVPL WebService
No possvel prosseguir para a prxima tela sem que seja informada, no mnimo, uma amarrao entre um host e
uma Empresa/Filial.
Host Virtual
Empresa/Filial
Mnimo Usurios
Mximo Usurios
Com base nos campos Mnimo Usurios e Mximo Usurios, o Assistente ir determinar a quantidade mdia de
processos (working threads) que o site ir utilizar.
Exemplo:
Mnimo: 5
Mximo: 10
Com base nesta configurao, o Protheus ir determinar um nmero de processos para atender a essa demanda.
Considerando que a mdia de usurios por processo de 10 para 1, neste caso, o Protheus ir configurar o nmero
mnimo de 1 processo e o mximo de 3.
A informao do nmero mnimo no necessria; caso omitida, ser considerado 1 processo. A informao do
nmero mximo obrigatria.
Verso 12 19
Programao ADVPL WebService
Ao confirmar a instalao, o pacote de arquivos do mdulo Web ser descompactado no diretrio raiz de imagens
informado, e o arquivo de configuraes do ByYou Application Server (appserver.ini) ser atualizado com as definies
pertinentes ao mdulo (Host, Processos WEB/WEBEX).
Ao final do processo de atualizao, o Assistente ser reiniciado para apresentao da tela inicial do Wizard.
20 Verso 12
Programao ADVPL WebService
Feche o assistente e levante o servio em modo console para verificar o seu funcionamento
A diferena entre ambas que a segunda opo permite especificar mais detalhes do ambiente de execuo do
servio, configurar os servios de Web Sites simultaneamente e o atendimento diferenciado do processamento para
mais de um host e diretrios virtuais.
A seguir, observe um exemplo de como configurar o servidor TOTVS | Application Server para Web Services, utilizando
a seo [WebServices].
Verso 12 21
Programao ADVPL WebService
Importante
Esta configurao exige que a seo [HTTP] no esteja configurada no TOTVS | Application
Server. J que a configurao ir internamente habilitar o servio de HTTP e configurar o
processo de resposta para o Web Services.
Exerccio
[WebServices]
Enable=1; (Obrigatrio) - Indica se o service est habilitado (1) ou no (0).
Environment=PROTHEUS;
(Obrigatrio) - Indica qual environment do Server que ir atender as requisies.
Conout=0;
(Opcional) - Permite a exibio de informaes dos status internos do servio
(padro=0:desabilitado).
Utilizado APENAS para depurao, em casos especficos, pois prejudica significativamente a
performance do(s) servio(s).
Trace=0;
(Opcional) - Habilita a gravao de um arquivo de log (wsstrace.log), contendo as informaes
sobre todas as chamadas e status do Web Service (padro=0).
PrepareIn=01,01;
(Obrigatrio) - Permite especificar qual a empresa e filial do ERP sero utilizados para a montagem
do ambiente de processamento as requisies.
NameSpace=http://localhost:81;
(Opcional) - Permite especificar o nome do namespace'padro', utilizado pelo(s) servio(s)
compilado(s) sem a definio de 'NameSpace'. (Padro=host atualmente utilizado).
URLLocation=http://localhost:81;
(Opcional) - Permite especificar a URL responsvel pelo atendimento s solicitaes de
processamento do(s) servio(s) (padro=host atualmente utilizado).
No entanto, possvel configurar o Web Service manualmente. Para isso, deve-se inicialmente habilitar o servio de
HTTP do servidor Protheus, configurar um processo WEBEX apontando para funes internas de processamento dos
Web Services e configurar um host atravs do qual as requisies de processamento sero atendidas.
22 Verso 12
Programao ADVPL WebService
Exerccio
Type=WEBEX; (Obrigatrio) - Tipo do job para Web Services deve ser WEBEX.
PrepareIn=99,01; (Obrigatrio) - Permite especificar qual empresa e filial do ERP sero utilizadas
para a montagem do ambiente de processamento das requisies.
Verso 12 23
Programao ADVPL WebService
Exemplo
Caso o host configurado para os Web Services seja o host local (localhost), deve-se acessar o endereo:
http://localhost:90/ws. Se estiver utilizando o sistema Microsiga Protheus, a tela apresentada ser semelhante ao
exemplo abaixo:
Observe que, na janela acima, so apresentados todos os servios compilados e disponibilizados no repositrio de
objetos do ambiente configurado. Atravs dessa janela, possvel obter mais detalhes de cada um dos servios
compilados. Cada servio ativo um link para uma pgina que apresentar todos os mtodos do servio com um link
do servidor TOTVS | Application Server que fornecer a descrio do servio (WSDL).
24 Verso 12
Programao ADVPL WebService
Atravs desta janela, possvel obter a descrio do servio WSDL ao clicar no link disponvel em "Descrio do
Servio (WSDL)". Ao clicar neste link, uma nova janela ser apresentada exibindo o documento WSDL do servio.
Alm disso, cada mtodo do servio disponibilizado tambm um link para uma pgina onde so apresentados os
exemplos de pacotes SOAP que esse mtodo especificamente espera para recepo de parmetros e o modelo de
retorno do servio.
Verso 12 25
Programao ADVPL WebService
Caso, o fonte-client AdvPL do servio, seja gerado e esteja compilado no repositrio atual, a interface de consulta
habilita a funcionalidade de teste do Web Services, atravs da interface HTTP, apresentando no final da tela o boto
testar.
Ao clicar nesse boto, ser montada uma tela HTML para que os parmetros do servio sejam preenchidos. Aps o
preencher os parmetros solicitados e submet-los, o pacote de retorno do servio e seu respectivo status so
retornados no browse.
A especificao de um WebService permite que um servio seja declarado de modo a no receber nenhum parmetro,
mas exige que o Web Service sempre possua um retorno.
8. Codificando o servio
Para codificar um servio, deve-se utilizar o TOTVS | Development Studio, criar um novo arquivo de programa e nele
escrever o servio. A numerao disposta esquerda do cdigo fonte meramente ilustrativa, no devendo ser
digitada. Essa numerao utilizada mais abaixo, para detalhar o cdigo exemplo linha a linha.
1. #include "Protheus.ch"
2. #include "ApWebSRV.ch"
3. #include "TbiConn.ch"
4.
5. WSSERVICE SERVERTIME Description "VEJA O HORARIO"
6.
7. WSDATA Horrio AS String
8. WSDATA Parmetro AS String
Linha 1 - especificada a utilizao do include Totvs.CH ou Protheus.ch, contendo as definies dos comandos AdvPL
e demais constantes.
26 Verso 12
Programao ADVPL WebService
Linha 3 - especificada a utilizao do include TBICONN.CH, contendo as definies dos comandos AdvPL para
conectar ao banco e Protheus desejados.
Linha 5 - Com esta instruo, definido o incio da classe do servio principal, qual damos o nome de SERVERTIME.
Linha 6 - Dentro da estrutura deste servio, informado que um dos parmetros utilizados chama-se horrio, e ser do
tipo string.
Linha 9 - Dentro da estrutura deste servio, informado que um dos mtodos do servio chama-se GetServerTime.
Linha 10 - Como no so necessrias mais propriedades ou mtodos neste servio, a estrutura do servio fechada
com esta instruo.
Linha 11 - Aqui declarado o fonte do mtodo GetServerTime, que receber parmetros, informado que seu retorno
ser o dado Horrio (declarado na classe do servio como uma propriedade, do tipo string).
Linha 12 - atribudo na propriedade ::Horrio da classe deste servio, o retorno da funo AdvPL Time(), que retorna
a hora atual no servidor no formato HH:MM:SS. Deve-se utilizar "::" para alimentarmos a propriedade da classe atual.
Linha 13 - O mtodo GetServerTime finalizado nesta linha, retornando .T. (verdadeiro), indicando que o servio foi
executado com sucesso.
Aps compilado o servio, deve-se acessar novamente a pgina de ndice de servios (wsindex.apw) e verificar se o
novo servio compilado encontra-se l.
Verso 12 27
Programao ADVPL WebService
9. Testando o servio
Para executar isto dentro de um cdigo, a princpio, devemos gerar um client de conexo do WS-Service.
28 Verso 12
Programao ADVPL WebService
Verso 12 29
Programao ADVPL WebService
Ao Clicar em concluir o sistema ir gerar o cdigo fonte do client do referido Services informado.
#include "Totvs.ch"
#include "Totvswebsrv.ch"
/* ===============================================================================
WSDL Location http://localhost:81/SERVERTTIME.apw?WSDL
Observaes Cdigo-Fonte gerado por ADVPL WSDL Client 1.111215
Alteraes neste arquivo podem causar funcionamento incorreto
e sero perdidas caso o cdigo-fonte seja gerado novamente.
=============================================================================== */
/* -------------------------------------------------------------------------------
30 Verso 12
Programao ADVPL WebService
WSCLIENT WSSERVERTTIME
WSMETHOD NEW
WSMETHOD INIT
WSMETHOD RESET
WSMETHOD CLONE
WSMETHOD GETSERVERTTIME
ENDWSCLIENT
BEGIN WSMETHOD
Verso 12 31
Programao ADVPL WebService
::Init()
::cGETSERVERTTIMERESULT := WSAdvValue(
oXmlRet,"_GETSERVERTTIMERESPONSE:_GETSERVERTTIMERESULT:TEXT","string",NIL,NIL,NIL,NIL,NIL
,NIL)
END WSMETHOD
oXmlRet := NIL
Return .T.
#include "Totvs.ch"
#include "Totvswebsrv.ch"
/* ===============================================================================
WSDL Location http://localhost:81/SERVERTTIME.apw?WSDL
Observaes Cdigo-Fonte gerado por ADVPL WSDL Client 1.111215
Alteraes neste arquivo podem causar funcionamento incorreto
e sero perdidas caso o cdigo-fonte seja gerado novamente.
=============================================================================== */
Este cdigo o IDE gera, informando os includes obrigatrias para o Client do WebService executar. Foi criada uma
funo User Function _GGLXARK aleatria para esse fonte, cujo nome poder ser alterado pelo usurio
posteriormente.
/* -------------------------------------------------------------------------------
WSDL Service WSSERVERTTIME
------------------------------------------------------------------------------- */
WSCLIENT WSSERVERTTIME
WSMETHOD NEW
WSMETHOD INIT
WSMETHOD RESET
WSMETHOD CLONE
WSMETHOD GETSERVERTTIME
32 Verso 12
Programao ADVPL WebService
ENDWSCLIENT
Essa parte inicializa a criao do client do WebService. Podemos notar que o nome do cliente do WebService
SERVERTTIME parecido com o nome do Client WSSERVERTTIME.
WSMETHOD NEW
WSMETHOD INIT
WSMETHOD RESET
WSMETHOD CLONE
Trata-se de um processo de criao do objeto WebService para repassar todo o contedo do WebService gerado para
uma varivel definida pelo usurio.
Pode, analisando o prprio mtodo, chamar outro mtodo gerado pelo IDE INIT.
Trata-se de um processo de criao do objeto WebService para disponibilizar a criao ou chamada de outros servios
disponvel no repositrio para complementar o WebService do cliente.
Trata-se de um processo de limpeza de variveis do WebService para que voc possa utiliz-lo novamente sem estar
com as informaes executadas anteriormente.
Verso 12 33
Programao ADVPL WebService
Tratamento de gerar uma nova varivel com o Objeto criado do WebService. Duplica a informao dos dados do
WebService.
Tratamento de executar o service disponvel pelo WebService e retornar o processo executado por ele, retornando na
varivel cGETSERVERTTIMERESULT.
BEGIN WSMETHOD
::Init()
::cGETSERVERTTIMERESULT:=WSAdvValue(oXmlRet,
"_GETSERVERTTIMERESPONSE:_GETSERVERTTIMERESULT:TEXT" , "string",NIL,NIL,NIL,NIL,NIL,NIL)
END WSMETHOD
oXmlRet := NIL
Return .T.
O cdigo fonte utiliza uma funo chamada WSSoapValue. Esta funo executa toda a estrutura do XML para dentro
do WebService, criando as suas respectivas tags que o mtodo solicitado exige.
Logo abaixo apresentada outra funo: WSADVVALUE, que retorna o valor que o WebService est disponibilizando.
Devemos compilar o cdigo fonte gerado pelo DevStudio e podemos fazer tratamentos de notificaes no Mtodo com
a funo SetSoapFault.
34 Verso 12
Programao ADVPL WebService
Exemplo:
#include Protheus.ch
Return()
If oObj := WSXSERVERTIME():NEW()
oObj:GETSERVERTIME(' ')
msgAlert( oObj:cGETSERVERTIMERESULT )
Else
cSvcError := GetWSCError() // Resumo do erro
cSoapFCode := GetWSCError(2) // Soap Fault Code
cSoapFDescr := GetWSCError(3) // Soap Fault Description
If ! empty(cSoapFCode)
// Caso a ocorrncia de erro esteja com o fault_code preenchido ,
// a mesma teve relao com a chamada do servio .
MsgStop(cSoapFDescr,cSoapFCode)
Else
// Caso a ocorrncia no tenha o soap_code preenchido
// Ela est relacionada a uma outra falha ,
// provavelmente local ou interna.
MsgStop(cSvcError,'FALHA INTERNA DE EXECUCAO DO SERVIO')
Endif
Endif
Return( NIL )
Verso 12 35
Programao ADVPL WebService
Exerccio
11. TWsdlManager
A classe TWsdlManager faz o tratamento para arquivos WSDL (Web Services Description Language). Esta classe
implementa mtodos para identificao das informaes de envio e resposta das operaes definidas, alm de mtodos
para envio e recebimento do documento SOAP.
A classe trabalha com 2 tipos de dados: os tipos complexos, que so as sees do XML, e os tipos simples, que so as
tags que recebem valor. Por exemplo, numa operao de insero de clientes, a tag "cliente" um tipo complexo, pois
contm os dados do cliente dentro, e as uma tag "nome" um tipo simples, pois recebe diretamente um valor (no caso,
o nome do cliente).
TWsdlManager ir realizar o parse de um WSDL, seja por uma URL ou por arquivo, e ir montar internamente uma lista
com os tipos simples e outra com os tipos complexos. A lista de tipos complexos ter somente os tipos complexos que
tenham nmero varivel de ocorrncias. Por exemplo, se tiver 2 tipos complexos onde um deles tem mnimo de 1 e
mximo de 1, e outro com mnimo de 1 e mximo 2, s o que tem o valor mnimo diferente do valor mximo ir ser
listado.
Atravs do mtodo NextComplex possvel verificar quais so esses elementos de tipo complexo que necessitam de
definio do nmero de ocorrncias. Esse mtodo deve ser chamado em recurso, at no existirem mais elementos
retornados (ir retornar Nil). Para cada elemento retornado deve-se definir a quantidade de vezes que a tag ir aparecer
no XML final (SOAP). Para isso utiliza-se o mtodo SetComplexOccurs. Caso no seja especificado a quantidade de
vezes que a tag ir aparecer, a classe ir considerar a quantidade como 0 (zero).
Caso seja passado zero no mtodo SetComplexOccurs, ele ir marcar os elementos simples e complexos dentro da tag
para serem ignorados, o que far com que os elementos complexo internos no apaream no retorno do mtodo
NextComplex, e os elementos simples internos no sero retornados pelo mtodo SimpleInput.
36 Verso 12
Programao ADVPL WebService
Uma vez definida a quantidade de vezes que os tipos complexos iro aparecer na mensagem SOAP, podemos chamar
o mtodo SimpleInput, para retornar quais so os campos que iro receber valor. Os tipos simples podem ter seus
valores definidos atravs dos mtodos SetValue (para 1 valor apenas) ou SetValues (para mais de 1 valor). Para saber
a quantidade de valores aceitos pelo tipo simples s olhar a quantidade mnima e mxima informada no mtodo
SimpleInput, ndices 3 e 4 de cada tag, respectivamente.
Exemplo:
Local oWsdl
Local lOk
Local aOps := {}
Local aComplex := {}
Local aSimple := {}
if !lOk
MsgStop( oWsdl:cError , "SetOperation(ConversionRate) ERROR")
Return
Endif
// Verifica o tipo de parametro que vai ser usado pelo mtodo, //retornando quais
// so os campos que iro receber valor
aComplex := oWsdl:NextComplex()
aSimple := oWsdl:SimpleInput()
Verso 12 37
Programao ADVPL WebService
lOk := oWsdl:SendSoapMsg()
if !lOk
MsgStop( oWsdl:cError , "SendSoapMsg() ERROR")
Return
endif
aElem := StrTokArr(cResp,chr(10))
MsgInfo( SubStr(aElem[2], AT(":",aElem[2] )+1))
Return( NIL )
Para saber para qual a empresa o cliente enviar os dados, ele dever saber qual a empresa e filial que possumos.
#include "Totvs.ch"
#include "Totvswebsrv.ch"
WsStruct EstruturaEmp
WsData M0_CODIGO As String
38 Verso 12
Programao ADVPL WebService
Verso 12 39
Programao ADVPL WebService
if cCodEmp != 'Abrir'
::cRet := "Palavra Chave Invalida"
aadd(aEmpresa,WsClassNew("EstruturaEmp"))
aEmpresa[1]:M0_CODIGO := ""
aEmpresa[1]:M0_CODFIL := ""
aEmpresa[1]:M0_FILIAL := ""
aEmpresa[1]:M0_NOME := ""
aEmpresa[1]:M0_NOMECOM := ""
aEmpresa[1]:M0_ENDCOB := ""
aEmpresa[1]:M0_CIDCOB := ""
aEmpresa[1]:M0_ESTCOB := ""
aEmpresa[1]:M0_CEPCOB := ""
aEmpresa[1]:M0_ENDENT := ""
aEmpresa[1]:M0_CIDENT := ""
aEmpresa[1]:M0_ESTENT := ""
aEmpresa[1]:M0_CEPENT := ""
aEmpresa[1]:M0_CGC := ""
aEmpresa[1]:M0_INSC := ""
aEmpresa[1]:M0_TEL := ""
40 Verso 12
Programao ADVPL WebService
aEmpresa[1]:M0_EQUIP := ""
aEmpresa[1]:M0_SEQUENC := ""
aEmpresa[1]:M0_DOCSEQ := 0
aEmpresa[1]:M0_FAX := ""
aEmpresa[1]:M0_PRODRUR := ""
aEmpresa[1]:M0_BAIRCOB := ""
aEmpresa[1]:M0_BAIRENT := ""
aEmpresa[1]:M0_COMPCOB := ""
aEmpresa[1]:M0_COMPENT := ""
aEmpresa[1]:M0_TPINSC := 0
aEmpresa[1]:M0_CNAE := ""
aEmpresa[1]:M0_FPAS := ""
aEmpresa[1]:M0_ACTRAB := ""
aEmpresa[1]:M0_CODMUN := ""
aEmpresa[1]:M0_NATJUR := ""
aEmpresa[1]:M0_DTBASE := ""
aEmpresa[1]:M0_NUMPROP := 0
aEmpresa[1]:M0_MODEND := ""
aEmpresa[1]:M0_MODINSC := ""
aEmpresa[1]:M0_CAUSA := ""
aEmpresa[1]:M0_INSCANT := ""
aEmpresa[1]:M0_TEL_IMP := ""
aEmpresa[1]:M0_FAX_IMP := ""
aEmpresa[1]:M0_TEL_PO := ""
aEmpresa[1]:M0_FAX_PO := ""
aEmpresa[1]:M0_IMP_CON := ""
aEmpresa[1]:M0_CODZOSE := ""
aEmpresa[1]:M0_DESZOSE := ""
aEmpresa[1]:M0_COD_ATV := ""
aEmpresa[1]:M0_INS_SUF := ""
aEmpresa[1]:M0_EMERGEN := ""
aEmpresa[1]:M0_LIBMOD := ""
aEmpresa[1]:M0_TPESTAB := ""
aEmpresa[1]:M0_DTAUTOR := STOD("")
aEmpresa[1]:M0_EMPB2B := ""
aEmpresa[1]:M0_CAIXA := ""
aEmpresa[1]:M0_LICENSA := ""
aEmpresa[1]:M0_CORPKEY := ""
aEmpresa[1]:M0_CHKSUM := 0
aEmpresa[1]:M0_DTVLD := STOD("")
aEmpresa[1]:M0_PSW := ""
aEmpresa[1]:M0_CTPSW := ""
aEmpresa[1]:M0_INTCTRL := ""
aEmpresa[1]:M0_INSCM := ""
aEmpresa[1]:M0_NIRE := ""
aEmpresa[1]:M0_DTRE := STOD("")
aEmpresa[1]:M0_CNES := ""
aEmpresa[1]:M0_PSWSTRT := ""
aEmpresa[1]:M0_DSCCNA := ""
aEmpresa[1]:M0_ASSPAT1 := ""
aEmpresa[1]:M0_ASSPAT2 := ""
aEmpresa[1]:M0_ASSPAT3 := ""
Verso 12 41
Programao ADVPL WebService
aEmpresa[1]:M0_SIZEFIL := 0
aEmpresa[1]:M0_LEIAUTE := ""
aEmpresa[1]:M0_PICTURE := ""
aEmpresa[1]:M0_STATUS := ""
aEmpresa[1]:M0_RNTRC := ""
aEmpresa[1]:M0_DTRNTRC := STOD("")
aEmpresa[1]:X_MENSAGEM := ::cRet
Return .t.
endif
aRet := SM0->(GETAREA())
WHILE SM0->(!EOF())
nDados += 1
aadd(aEmpresa,WsClassNew("EstruturaEmp"))
aEmpresa[nDados]:M0_CODIGO := SM0->M0_CODIGO
aEmpresa[nDados]:M0_CODFIL := SM0->M0_CODFIL
aEmpresa[nDados]:M0_FILIAL := SM0->M0_FILIAL
aEmpresa[nDados]:M0_NOME := SM0->M0_NOME
aEmpresa[nDados]:M0_NOMECOM := SM0->M0_NOMECOM
aEmpresa[nDados]:M0_ENDCOB := SM0->M0_ENDCOB
aEmpresa[nDados]:M0_CIDCOB := SM0->M0_CIDCOB
aEmpresa[nDados]:M0_ESTCOB := SM0->M0_ESTCOB
aEmpresa[nDados]:M0_CEPCOB := SM0->M0_CEPCOB
aEmpresa[nDados]:M0_ENDENT := SM0->M0_ENDENT
aEmpresa[nDados]:M0_CIDENT := SM0->M0_CIDENT
aEmpresa[nDados]:M0_ESTENT := SM0->M0_ESTENT
aEmpresa[nDados]:M0_CEPENT := SM0->M0_CEPENT
aEmpresa[nDados]:M0_CGC := SM0->M0_CGC
aEmpresa[nDados]:M0_INSC := SM0->M0_INSC
aEmpresa[nDados]:M0_TEL := SM0->M0_TEL
aEmpresa[nDados]:M0_EQUIP := SM0->M0_EQUIP
aEmpresa[nDados]:M0_SEQUENC := SM0->M0_SEQUENC
aEmpresa[nDados]:M0_DOCSEQ := SM0->M0_DOCSEQ
aEmpresa[nDados]:M0_FAX := SM0->M0_FAX
aEmpresa[nDados]:M0_PRODRUR := SM0->M0_PRODRUR
aEmpresa[nDados]:M0_BAIRCOB := SM0->M0_BAIRCOB
aEmpresa[nDados]:M0_BAIRENT := SM0->M0_BAIRENT
aEmpresa[nDados]:M0_COMPCOB := SM0->M0_COMPCOB
aEmpresa[nDados]:M0_COMPENT := SM0->M0_COMPENT
aEmpresa[nDados]:M0_TPINSC := SM0->M0_TPINSC
aEmpresa[nDados]:M0_CNAE := SM0->M0_CNAE
aEmpresa[nDados]:M0_FPAS := SM0->M0_FPAS
aEmpresa[nDados]:M0_ACTRAB := SM0->M0_ACTRAB
aEmpresa[nDados]:M0_CODMUN := SM0->M0_CODMUN
aEmpresa[nDados]:M0_NATJUR := SM0->M0_NATJUR
aEmpresa[nDados]:M0_DTBASE := SM0->M0_DTBASE
aEmpresa[nDados]:M0_NUMPROP := SM0->M0_NUMPROP
aEmpresa[nDados]:M0_MODEND := SM0->M0_MODEND
aEmpresa[nDados]:M0_MODINSC := SM0->M0_MODINSC
aEmpresa[nDados]:M0_CAUSA := SM0->M0_CAUSA
aEmpresa[nDados]:M0_INSCANT := SM0->M0_INSCANT
42 Verso 12
Programao ADVPL WebService
aEmpresa[nDados]:M0_TEL_IMP := SM0->M0_TEL_IMP
aEmpresa[nDados]:M0_FAX_IMP := SM0->M0_FAX_IMP
aEmpresa[nDados]:M0_TEL_PO := SM0->M0_TEL_PO
aEmpresa[nDados]:M0_FAX_PO := SM0->M0_FAX_PO
aEmpresa[nDados]:M0_IMP_CON := SM0->M0_IMP_CON
aEmpresa[nDados]:M0_CODZOSE := SM0->M0_CODZOSE
aEmpresa[nDados]:M0_DESZOSE := SM0->M0_DESZOSE
aEmpresa[nDados]:M0_COD_ATV := SM0->M0_COD_ATV
aEmpresa[nDados]:M0_INS_SUF := SM0->M0_INS_SUF
aEmpresa[nDados]:M0_EMERGEN := SM0->M0_EMERGEN
aEmpresa[nDados]:M0_LIBMOD := SM0->M0_LIBMOD
aEmpresa[nDados]:M0_TPESTAB := SM0->M0_TPESTAB
aEmpresa[nDados]:M0_DTAUTOR := SM0->M0_DTAUTOR
aEmpresa[nDados]:M0_EMPB2B := SM0->M0_EMPB2B
aEmpresa[nDados]:M0_CAIXA := SM0->M0_CAIXA
aEmpresa[nDados]:M0_LICENSA := SM0->M0_LICENSA
aEmpresa[nDados]:M0_CORPKEY := SM0->M0_CORPKEY
aEmpresa[nDados]:M0_CHKSUM := SM0->M0_CHKSUM
aEmpresa[nDados]:M0_DTVLD := SM0->M0_DTVLD
aEmpresa[nDados]:M0_PSW := SM0->M0_PSW
aEmpresa[nDados]:M0_CTPSW := SM0->M0_CTPSW
aEmpresa[nDados]:M0_INTCTRL := SM0->M0_INTCTRL
aEmpresa[nDados]:M0_INSCM := SM0->M0_INSCM
aEmpresa[nDados]:M0_NIRE := SM0->M0_NIRE
aEmpresa[nDados]:M0_DTRE := SM0->M0_DTRE
aEmpresa[nDados]:M0_CNES := SM0->M0_CNES
aEmpresa[nDados]:M0_PSWSTRT := SM0->M0_PSWSTRT
aEmpresa[nDados]:M0_DSCCNA := SM0->M0_DSCCNA
aEmpresa[nDados]:M0_ASSPAT1 := SM0->M0_ASSPAT1
aEmpresa[nDados]:M0_ASSPAT2 := SM0->M0_ASSPAT2
aEmpresa[nDados]:M0_ASSPAT3 := SM0->M0_ASSPAT3
aEmpresa[nDados]:M0_SIZEFIL := SM0->M0_SIZEFIL
aEmpresa[nDados]:M0_LEIAUTE := SM0->M0_LEIAUTE
aEmpresa[nDados]:M0_PICTURE := SM0->M0_PICTURE
aEmpresa[nDados]:M0_STATUS := SM0->M0_STATUS
aEmpresa[nDados]:M0_RNTRC := SM0->M0_RNTRC
aEmpresa[nDados]:M0_DTRNTRC := SM0->M0_DTRNTRC
aEmpresa[nDados]:X_MENSAGEM := "Sucesso "+strzero(nDados,2)
SM0->(DBSKIP())
END
RESTAREA(aRet)
Verso 12 43
Programao ADVPL WebService
Este cdigo apresenta a criao do WebService chamado CTT apresentando a Descrio "Treinamento do WebService
para o Curso CTT".
Podemos observar que a varivel AEMPRESA ser um array com a estrutura definida pelo mtodo wsstruct:
WsStruct EstruturaEmp
WsData M0_CODIGO As String
WsData M0_CODFIL As String
WsData M0_FILIAL As String
WsData M0_NOME As String
WsData M0_NOMECOM As String
WsData M0_ENDCOB As String
WsData M0_CIDCOB As String
WsData M0_ESTCOB As String
WsData M0_CEPCOB As String
WsData M0_ENDENT As String
WsData M0_CIDENT As String
WsData M0_ESTENT As String
WsData M0_CEPENT As String
WsData M0_CGC As String
WsData M0_INSC As String
WsData M0_TEL As String
WsData M0_EQUIP As String
WsData M0_SEQUENC As String
WsData M0_DOCSEQ As INTEGER
WsData M0_FAX As String
WsData M0_PRODRUR As String
WsData M0_BAIRCOB As String
WsData M0_BAIRENT As String
WsData M0_COMPCOB As String
WsData M0_COMPENT As String
WsData M0_TPINSC As Integer
WsData M0_CNAE As String
44 Verso 12
Programao ADVPL WebService
Nesse Mtodo, esto sendo apresentados todos campos do Sigamat.emp. Por fim, ser criado um array e cada vetor
desse array ser o campo apresentado como varivel na estrutura.
Verso 12 45
Programao ADVPL WebService
<aEmpresa>
<M0_CODIGO>01</M0_CODIGO>
Etc...
</aEmpresa>
Logo abaixo, foi criado o mtodo de listar empresa, um servio que ir ler o sigamat e apresentar quantas empresas
temos no sigamat.emp para o cliente
if cCodEmp != 'Abrir'
::cRet := "Palavra Chave Invalida"
aadd(aEmpresa,WsClassNew("EstruturaEmp"))
Aps validar a informao da chave cCodEmp que definimos, dever ser aberto o sistema que analisa se a palavra
est ou no correta.
Caso no esteja correta, ele entra no IF alimenta a varivel ::cRet com a frase Palavra Chave Invlida.
2.2 Se a palavra chave estiver correta, o sistema abre a tabela de empresa SM0 Sigamat.emp e comea a
fazer um loop correndo todos os registros encontrados nessa tabela.
WHILE SM0->(!EOF())
nDados += 1
aadd(aEmpresa,WsClassNew("EstruturaEmp"))
46 Verso 12
Programao ADVPL WebService
aEmpresa[nDados]:M0_CODIGO := SM0->M0_CODIGO
aEmpresa[nDados]:M0_CODFIL := SM0->M0_CODFIL
aEmpresa[nDados]:M0_FILIAL := SM0->M0_FILIAL
aEmpresa[nDados]:M0_NOME := SM0->M0_NOME
aEmpresa[nDados]:M0_NOMECOM := SM0->M0_NOMECOM
aEmpresa[nDados]:M0_ENDCOB := SM0->M0_ENDCOB
aEmpresa[nDados]:M0_CIDCOB := SM0->M0_CIDCOB
aEmpresa[nDados]:M0_ESTCOB := SM0->M0_ESTCOB
aEmpresa[nDados]:M0_CEPCOB := SM0->M0_CEPCOB
aEmpresa[nDados]:M0_ENDENT := SM0->M0_ENDENT
aEmpresa[nDados]:M0_CIDENT := SM0->M0_CIDENT
aEmpresa[nDados]:M0_ESTENT := SM0->M0_ESTENT
aEmpresa[nDados]:M0_CEPENT := SM0->M0_CEPENT
aEmpresa[nDados]:M0_CGC := SM0->M0_CGC
aEmpresa[nDados]:M0_INSC := SM0->M0_INSC
aEmpresa[nDados]:M0_TEL := SM0->M0_TEL
aEmpresa[nDados]:M0_EQUIP := SM0->M0_EQUIP
aEmpresa[nDados]:M0_SEQUENC := SM0->M0_SEQUENC
aEmpresa[nDados]:M0_DOCSEQ := SM0->M0_DOCSEQ
aEmpresa[nDados]:M0_FAX := SM0->M0_FAX
aEmpresa[nDados]:M0_PRODRUR := SM0->M0_PRODRUR
aEmpresa[nDados]:M0_BAIRCOB := SM0->M0_BAIRCOB
aEmpresa[nDados]:M0_BAIRENT := SM0->M0_BAIRENT
aEmpresa[nDados]:M0_COMPCOB := SM0->M0_COMPCOB
aEmpresa[nDados]:M0_COMPENT := SM0->M0_COMPENT
aEmpresa[nDados]:M0_TPINSC := SM0->M0_TPINSC
aEmpresa[nDados]:M0_CNAE := SM0->M0_CNAE
aEmpresa[nDados]:M0_FPAS := SM0->M0_FPAS
aEmpresa[nDados]:M0_ACTRAB := SM0->M0_ACTRAB
aEmpresa[nDados]:M0_CODMUN := SM0->M0_CODMUN
aEmpresa[nDados]:M0_NATJUR := SM0->M0_NATJUR
aEmpresa[nDados]:M0_DTBASE := SM0->M0_DTBASE
aEmpresa[nDados]:M0_NUMPROP := SM0->M0_NUMPROP
aEmpresa[nDados]:M0_MODEND := SM0->M0_MODEND
aEmpresa[nDados]:M0_MODINSC := SM0->M0_MODINSC
aEmpresa[nDados]:M0_CAUSA := SM0->M0_CAUSA
aEmpresa[nDados]:M0_INSCANT := SM0->M0_INSCANT
aEmpresa[nDados]:M0_TEL_IMP := SM0->M0_TEL_IMP
aEmpresa[nDados]:M0_FAX_IMP := SM0->M0_FAX_IMP
aEmpresa[nDados]:M0_TEL_PO := SM0->M0_TEL_PO
aEmpresa[nDados]:M0_FAX_PO := SM0->M0_FAX_PO
aEmpresa[nDados]:M0_IMP_CON := SM0->M0_IMP_CON
aEmpresa[nDados]:M0_CODZOSE := SM0->M0_CODZOSE
aEmpresa[nDados]:M0_DESZOSE := SM0->M0_DESZOSE
aEmpresa[nDados]:M0_COD_ATV := SM0->M0_COD_ATV
aEmpresa[nDados]:M0_INS_SUF := SM0->M0_INS_SUF
aEmpresa[nDados]:M0_EMERGEN := SM0->M0_EMERGEN
aEmpresa[nDados]:M0_LIBMOD := SM0->M0_LIBMOD
aEmpresa[nDados]:M0_TPESTAB := SM0->M0_TPESTAB
aEmpresa[nDados]:M0_DTAUTOR := SM0->M0_DTAUTOR
aEmpresa[nDados]:M0_EMPB2B := SM0->M0_EMPB2B
aEmpresa[nDados]:M0_CAIXA := SM0->M0_CAIXA
Verso 12 47
Programao ADVPL WebService
aEmpresa[nDados]:M0_LICENSA := SM0->M0_LICENSA
aEmpresa[nDados]:M0_CORPKEY := SM0->M0_CORPKEY
aEmpresa[nDados]:M0_CHKSUM := SM0->M0_CHKSUM
aEmpresa[nDados]:M0_DTVLD := SM0->M0_DTVLD
aEmpresa[nDados]:M0_PSW := SM0->M0_PSW
aEmpresa[nDados]:M0_CTPSW := SM0->M0_CTPSW
aEmpresa[nDados]:M0_INTCTRL := SM0->M0_INTCTRL
aEmpresa[nDados]:M0_INSCM := SM0->M0_INSCM
aEmpresa[nDados]:M0_NIRE := SM0->M0_NIRE
aEmpresa[nDados]:M0_DTRE := SM0->M0_DTRE
aEmpresa[nDados]:M0_CNES := SM0->M0_CNES
aEmpresa[nDados]:M0_PSWSTRT := SM0->M0_PSWSTRT
aEmpresa[nDados]:M0_DSCCNA := SM0->M0_DSCCNA
aEmpresa[nDados]:M0_ASSPAT1 := SM0->M0_ASSPAT1
aEmpresa[nDados]:M0_ASSPAT2 := SM0->M0_ASSPAT2
aEmpresa[nDados]:M0_ASSPAT3 := SM0->M0_ASSPAT3
aEmpresa[nDados]:M0_SIZEFIL := SM0->M0_SIZEFIL
aEmpresa[nDados]:M0_LEIAUTE := SM0->M0_LEIAUTE
aEmpresa[nDados]:M0_PICTURE := SM0->M0_PICTURE
aEmpresa[nDados]:M0_STATUS := SM0->M0_STATUS
aEmpresa[nDados]:M0_RNTRC := SM0->M0_RNTRC
aEmpresa[nDados]:M0_DTRNTRC := SM0->M0_DTRNTRC
aEmpresa[nDados]:X_MENSAGEM := "Sucesso "+strzero(nDados,2)
SM0->(DBSKIP())
END
48 Verso 12
Programao ADVPL WebService
Verso 12 49
Programao ADVPL WebService
Exerccio
3. Agora, iremos criar um outro WebService para gravar clientes na empresa desejada. Para isso, devemos criar
a estrutura que ir receber os dados, retornar, posteriormente, erros encontrados na estrutura enviada para o
WebService e executar a gravao.
50 Verso 12
Programao ADVPL WebService
dbUseArea(.T.,"TOPCONN",TCGENQRY(,,cQuery),X,.F.,.T.),;
WSMETHOD GRAVACLIENTE WSRECEIVE ACLIENTE,CCPF,_cEmp,_cFil WSSEND CREGSA1 WSSERVICE
CTT
Local cEmp := _cEmp
Local cFil := _cFil
Local aTab := {"SA1"}
Local cPdCpf := ""
Local aDat := {}
Local aSa1Stru := {}
Local aComplem := {}
Local cCodigo := ""
Local cLoja := ""
Local NOPC := 3
Local bQuery := {|X| Iif(Select(X) > 0, (X)->(dbCloseArea()), Nil),;
dbUseArea(.T.,"TOPCONN",TCGENQRY(,,cQuery),X,.F.,.T.),;
dbSelectArea(X),;
(X)->(dbGoTop())}
Private lMsErroauto := .f.
Private lMsHelpAuto := .f.
Private lautoErrNoFile := .T.
Podemos observer que definimos 4 variveis que iremos receber do client
ACLIENTE Estrutura criada dos dados necessaries para receber do cliente a informao para ser gravada
no Protheus
CCPF variavel do CPF do cliente para analise se ja existe na base de dados, caso exista ser atualizado
com os dados novos
_cEmp - Empresa que o cliente deve ser inserido
_cFil Filial da empresa que o cliente deve ser inserido
Declarao
WSDATA ACLIENTE AS CLIENTES // ESTRUTURA DE DADOS RECEBIDOS DO CLIENTE
WsData _cEmp as String
WsData _cFil as String
WSDATA CREGSA1 AS string // RETORNO DA MENSAGEM DO EXECAUTO
WSDATA CCPF AS string // VARIAVEL PARA RECEBER O CPF DO CLIENTE
// "CONFERENCIA SE JA EXISTE""
Criao da estrutura
WsStruct CLIENTES
WsData A1_COD as String
WsData A1_LOJA as String
WsData A1_NOME as String
WsData A1_NREDUZ as String
WsData A1_END as String
WsData A1_MUN as String
WsData A1_CGC as String
WsData A1_INSCRM as String
WsData A1_EMAIL as String
WsData A1_PAIS as String
WsData A1_ATIVO as String
WsData A1_CODPAIS as String
WsData A1_SISTORI as String
WsData A1_PESSOA as String
Verso 12 51
Programao ADVPL WebService
4. Esta parte do cdigo apresenta a anlise de importao, que possui uma regra de alimentar a varivel
::ACLIENTE utilizando WsClassNew (funo de criao de uma estrutura existente no WebService).
cPdCpf := tamsx3("A1_CGC")[1]
DBSELECTAREA("SA1")
SA1->(DBSETORDER(3))
IF SA1->(DBSEEK(XFILIAL("SA1")+PADR(CCPF,cPdCpf)))
NOPC := 4
cCodigo := SA1->A1_COD
cLoja := SA1->A1_LOJA
ENDIF
//
//iniciando a gravao do cadastro do cliente
//
AADD(aSa1Stru,{'A1_COD', "C",6,0})
AADD(aSa1Stru,{'A1_LOJA', "C",2,0})
AADD(aSa1Stru,{'A1_NOME', "C",50,0})
AADD(aSa1Stru,{'A1_NREDUZ', "C",40,0})
AADD(aSa1Stru,{'A1_END', "C",50,0})
AADD(aSa1Stru,{'A1_MUN', "C",10,0})
AADD(aSa1Stru,{'A1_COD_MUN', "C",10,0})
AADD(aSa1Stru,{'A1_PESSOA', "C",10,0})
AADD(aSa1Stru,{'A1_CGC', "C",20,0})
AADD(aSa1Stru,{'A1_INSCRM', "C",30,0})
AADD(aSa1Stru,{'A1_EMAIL', "C",50,0})
AADD(aSa1Stru,{'A1_ATIVO', "C",50,0})
AADD(aSa1Stru,{'A1_CODPAIS', "C",50,0})
AADD(aSa1Stru,{'A1_PAIS', "C",50,0})
AADD(aSa1Stru,{'A1_SISTORI', "C",60,0})
AADD(aSa1Stru,{'A1_TIPO', "C",60,0})
AADD(aSa1Stru,{'A1_ESTADO', "C",60,0})
AADD(aSa1Stru,{'A1_EST', "C",60,0})
AADD(aSa1Stru,{'A1_ENDNUM', "C",60,0})
AADD(aSa1Stru,{'A1_BAIRRO', "C",60,0})
52 Verso 12
Programao ADVPL WebService
AADD(aSa1Stru,{'A1_CEP', "C",60,0})
//
//Analisa se existe outros campos obrigatorio que no estava na estrutura
//campo adicionado posteriormente a sua criao do web services
//
SX3->(DBSETORDER(1))
SX3->(DBSEEK("SA1"))
WHILE SX3->(!EOF()) .AND. SX3->X3_ARQUIVO == "SA1"
IF aScan(aSa1Stru,{|X| alltrim(x[1]) == alltrim(SX3->X3_CAMPO)})=0 .AND. X3OBRIGAT(SX3-
>X3_CAMPO) //ANALISA SE E OBRIGATORIO E SE NO ESTA NA LISTA
AADD(aComplem,{alltrim(SX3->X3_CAMPO),SX3->X3_TIPO, SX3->X3_TAMANHO, SX3-
>X3_DECIMAL}) // CAMPO ADICIONADO
ENDIF
SX3->(DBSKIP())
END
//
//Regra de gravao do Array Recebido
//
aEval(aSa1Stru,{|x| ;
aadd(aDat,{ x[1],;
iif(valtype(&('ACLIENTE:'+x[1]))!="U",&('ACLIENTE:'+x[1]),;
iif(x[2]=='C',CRIAVAR(x[1]),;
iif(x[2]=='D',DATE(),;
iif(x[2]=='N',1,;
iif(x[2]=='L',.F.," "))))) ,;
nil });
})
//
//Tratamento para os campos que passaram a ser obrigatorios apos a criao do WebService
//
aEval(aComplem,{|x| aadd(aDat,{ x[1],CRIAVAR(x[1]),nil }) })
4.1 Esta parte do cdigo fonte captura a posio do array onde esta o cdigo do cliente e sua respectiva loja para
poder adicionar o novo cdigo, buscando pela rotina padro do GETSXENUM() .Caso o cdigo do cliente ou
sua loja sejam alterados, sero adicionados no array, para poder atualizar o registro.
Aps esta parte o sistema localiza o numero do cdigo do municpio utilizando a query e no final analisa os
campos que estiverem vazios, executando as informaes contidas na estrutura do sx3 X3_RELACAO
(Inicializador Padro).
//
//Regra de identificao dos campos para adicionar informaes proprias do Sistema
//
Verso 12 53
Programao ADVPL WebService
SX3->(DBSETORDER(2))
54 Verso 12
Programao ADVPL WebService
5. A parte informada abaixo representa a normalizao dos dados apresentados pelo client, quando o sistema ir
fazer a converso de dados para o sucesso da gravao. Caso os campos apresentados no estejam na
estrutura do sx3, o sistema ir limpar a varivel DAT para poder executar o EXECAUTO sem ERRO.
//
//Normalizando os Dados
//
aDeletar := {}
For nFor2 := 1 to len(adat)
if VALTYPE(adat[nFor2])<> "U"
nLin := aScan(aSa1Stru,{|x| alltrim(x[1]) == alltrim(adat[nFor2][1])})
if nLin<= 0 .OR. EMPTY(adat[nFor2][2])
aadd(aDeletar,nFor2)
else
if valtype(adat[nFor2][2]) != aSa1Stru[nLin][2]
if empty(adat[nFor2][2])
do case
case aSa1Stru[nLin][2] == 'D'
adat[nFor2][2] := stod('')
case aSa1Stru[nLin][2] == 'N'
adat[nFor2][2] := 0
case aSa1Stru[nLin][2] == 'C'
adat[nFor2][2] := padr(" ",TAMSX3(adat[nFor2][1])[1])
case aSa1Stru[nLin][2] == 'L'
adat[nFor2][2] := .F.
case aSa1Stru[nLin][2] == 'M'
adat[nFor2][2] := " "
endcase
else
do case
case aSa1Stru[nLin][2] == 'D'
adat[nFor2][2] :=
iif(empty(stod(adat[nFor2][2])),ctod(adat[nFor2][2]),stod(adat[nFor2][2]))
case aSa1Stru[nLin][2] == 'N'
adat[nFor2][2] := VAL(adat[nFor2][2])
case aSa1Stru[nLin][2] == 'C'
adat[nFor2][2] := cValtochar(adat[nFor2][2])
case aSa1Stru[nLin][2] == 'L'
adat[nFor2][2] :=
iif(upper(adat[nFor2][2])=='.F.',.f.,.t.)
case aSa1Stru[nLin][2] == 'M'
adat[nFor2][2] := cValtochar(adat[nFor2][2])
endcase
endif
ELSE
Verso 12 55
Programao ADVPL WebService
IF valtype(adat[nFor2][2]) == 'C'
adat[nFor2][2] := PADR(adat[nFor2][2],TAMSX3(adat[nFor2][1])[1])
ENDIF
endif
endif
endif
Next nfor2
//VARINFO('ADAT',ADAT)
FOR nFor2 := len(aDeletar) to 1 step -1
adel(aDat,aDeletar[nFor2])
next nFor2
//VARINFO('ADAT',ADAT)
aDat := asize(aDat,len(aDat)-len(aDeletar))
DBSELECTAREA("SA1")
nQtdDel := 0
6. E por fim a gravao dos dados recebidos pelo client na execuo do EXECAUTO.
Podemos ver que foi definida a funo BeginTran() que garante que, se as rotinas apresentarem algum tipo de
erro,o sistema no grave os dados.
A execuo do MSEXECAUTO para a funo MATA030 faz a gravao da varivel aDat preenchida
anteriormente e sua opo de gravao NOPC:
nOpc = 3 Incluso
nOpc = 4 Alterao
nOpc = 5 Excluso
Aps o execauto, verifica-se se a rotina pado gerou algum tipo de erro, alimentando a varivel lMsErroauto.Caso a
informao contida nela for verdadeira, ocorre a execuo da funo DisarmTransaction() que representa o rollback
das informaes gravadas pela metade. Para a captura da mensagem de erro, usamos a funo GETAUTOGRLOG()
em que fizemos o tratamento para ser apresentada em uma string.
Se a varivel for falsa, o sistema executa a funo EndTran(), que encerra a gravao, gravando todos os dados
informados e apresenta a informao de SUCESSO.
BeginTran()
//VARINFO('aDat',aDat)
//
//gravao de dados do Cliente
//
MSEXECAUTO( {|X,Y| MATA030(X,Y) },adat,NOPC)
IF lMsErroauto
//
//disarma a transao
//
nPx := 0
DisarmTransaction()
aAutoErro := GETAUTOGRLOG()
cMsg := ""
IF LEN(aAutoErro)>=2
cCpox := '- '+alltrim(substr(aAutoErro[1],at('_',aAutoErro[1])-2,10))
nPx := aScan(aAutoErro,{|W| cCpox$W })
56 Verso 12
Programao ADVPL WebService
if nPx<=0
nPx := aScan(aAutoErro,{|W| '< -- '$W })
endif
ENDIF
nTotV := iif(len(aAutoErro)>20,20,len(aAutoErro))
For nFor1 := 1 to nTotV
if !empty(alltrim(STRTRAN(STRTRAN(aAutoErro[nFor1],"'",'"'),'---','')))
cMsg +=
U_TIRACENTO(alltrim(STRTRAN(STRTRAN(aAutoErro[nFor1],"'",'"'),'---','')))+CRLF
endif
nExt nfor1
if nPx>0
cMsg += U_TIRACENTO(alltrim(STRTRAN(STRTRAN(aAutoErro[nPx],"'",'"'),'---
','')))+CRLF
endif
::CREGSA1:= "ERRO AO GRAVAR O CLIENTE:"+CRLF+cMsg
ELSE
EndTran()
::CREGSA1:= "SUCESSO CODIGO DO CLIENTE:"+cCodigo
ENDIF
RETURN .T.
No ato da execuo, o sistema apresenta a informao no console o XML gerado para o WebService.
Verso 12 57
Programao ADVPL WebService
Exerccio
58 Verso 12
Programao ADVPL WebService
13. APNDICES
Caso a execuo de um mtodo 'Client' de Web Services retorne .F., deve ser utilizada a funo GetWSCError(), para
identificar a origem da ocorrncia. Durante a execuo de um mtodo 'Client' de WebServices, so possveis
ocorrncias de erro das seguintes naturezas, em momentos especficos:
Durante a montagem do pacote SOAP, antes do envio dos parmetros do mtodo solicitados ao servidor, realizada
uma verificao naconsistncia do(s) parmetro(s) a serem enviados, tais como a obrigatoriedade do parmetro e o tipo
Advpl com o qual o parmetro foi alimentado. Se e somente se os parmetros informados forem vlidos, o pacote
SOAP montado postado no servidor de WebServices.
Ao postar o pacote, caso o host do Web Service utilizado ou o servidor referente ao mesmo no tenham sido
localizados ou no estejam no ar.
Uma vez enviado ao Server, a interface client entra em modo 'stand-by', aguardando por um pacote de retorno SOAP
do Server. Aps a postagem, caso o pacote devolvido no esteja em conformidade com a declarao do servio, ou o
servidor tenha devolvido um html ao invs de um xml 'SOAP'.
4. Erro Interno de execuo: Qualquer ocorrncia de erro fatal, seja antes ou depois do envio da requisio, cuja
origem no seja tratada ou prevista pelas rotinas 'Client' do Servio, como por exemplo um retorno de um
pacote XML com erro de sintaxe ou estruturalmente invlido.
Sintaxe:
GETWSCERROR - Recuperao de informaes ( [ nInfo ] ) --> xErrorInfo
Retorno:
xErrorInfo(qualquer)
Retorna a informao do erro solicitada atravs do parmetro nInfo . Caso nInfo seja 1 , 2 ou 3 , o retorno do
tipo String . Caso seja tipo 4 , ser retornado um Objeto XML.
Verso 12 59
Programao ADVPL WebService
Parmetros:
STRING
FLOAT
DOUBLE
DECIMAL
INT
60 Verso 12
Programao ADVPL WebService
INTEGER
LONG
UNSIGNEDINT
UNSIGNEDLONG
Caso o WSDL contenha um 'enumeration', utilizando um tipo de dado diferente dos declarados acima, o processo de
gerao de fonte abortado com a ocorrncia de erro acima, onde o 'enumeration' no suportado identificado em
<XXX> e <YYY>, correspondendo ao nome do parmetro e tipo utilizado, respectivamente.
Caso, neste processamento, uma estrutura contenha um determinado elemento que aponte para uma outra estrutura, e
esta no seja encontrada no WSDL ( ocorrncia <X> = A ), ou seja encontrada - porm registrada no como uma
estrutura (complextype)- ( ocorrncia <X> = B ), o WSDL considerado invlido, e o processo de gerao abortado
com a mensagem acima, identificando a estrutura pendente em <WSDLTYPE_NAME>.
Quando, dentro deste processamento, um parmetro de primeiro nvel (message) do WSDL for especificado sem nome,
o WSDL considerado invlido, e o processo de gerao abortado com a mensagem acima.
Quando, dentro deste processamento, um parmetro de primeiro nvel (message) do WSDL for especificado sem
definio de tipo, o WSDL considerado invlido, e o processo de gerao abortado com a mensagem acima.
Se, neste processamento, um parmetro de retorno do WSDL seja identificado como 'retorno nulo', o WSDL
considerado invlido, e o processo de gerao abortado com a mensagem acima.
Verso 12 61
Programao ADVPL WebService
Dentro deste processamento, caso uma estrutura complexa no contenha a especificao de seus elementos internos
e a mesma no contenha nenhuma referncia ao SCHEMA ou outra estrutura, o WSDL considerado invlido, e o
processo de gerao abortado com a mensagem acima, informando em [STRUCT_TYPE], o nome da estrutura
incompleta.
Neste processamento, se um parmetro de retorno do WSDL for identificado como 'retorno nulo', o WSDL
considerado invlido, e o processo de gerao abortado com a mensagem acima.
Importante
Esta ocorrncia semelhante ocorrncia WSCERR008, porm esta ocorrncia (011) refere-se
uma sub-estrutura do servio , e a primeira (008) refere-se um parmetro/estrutura de
primeiro nvel do servio.
62 Verso 12
Programao ADVPL WebService
Importante
Esta ocorrncia semelhante WSCERR009, porm esta indica uma falha em outro ponto da
rotina interna de anlise.
Quando neste processamento, um parmetro de tipo bsico no se encontrar entre os tipos bsicos suportados pelo
engine 'Client' de WebServices do ERP, a gerao do cdigo-fonte abortada com este erro, indicando em
SOAP_TYPE o tipo no suportado.
Neste processamento, para cada propriedade da estrutura do servio so montadas suas rotinas de inicializao. Caso
a rotina de gerao de cdigo-fonte receba a instruo de inicializar a propriedade reservada 'NULLPARAM', o
processamento abortado com esta ocorrncia.
Esta ocorrncia poderia ser causada por uma falha na validao inicial do WSDL, ou pela declarao de uma
propriedade do tipo 'NULLPARAM'; e at o momento no foi reproduzida.
Caso o servio utilize um soap-style RPC, e o node [XXX], correspondente ao retorno esperado do tipo [YYY] no for
encontrado no pacote, o processamento do pacote de retorno abortado com esta ocorrncia.
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
Verso 12 63
Programao ADVPL WebService
Para gerar um fonte 'Client' de WebServices, que utilize o protocolo HTTPS, a build do ERP deve ser atualizada.
WSCERR017 / HTTP[S] Requisio retornou [NIL]
Esta ocorrncia de erro ocorre na gerao de um cdigo-fonte de WebServices 'Client', utilizando o TOTVS |
Development Studio. Quando informada uma URL para buscar a definio do servio (WSDL), utilizando o protocolo
HTTP ou HTTPS; e no foi possvel buscar o link solicitado, o processamento abortado com a ocorrncia acima.
Verifique a URL digitada e teste a requisio da mesma atravs de um navegador, para certificar-se que vlida e que
a definio WSDL est realmente acessvel sob o link informado.
Diferentemente da ocorrncia WSCERR017, esta ocorrncia foi reproduzida quando o servidor de WebServices que
fornece o documento WSDL foi localizado, a requisio foi feita com sucesso, porm o servidor recebeu como retorno
um pacote HTTP incompleto ou invlido.
Verifique a URL digitada, e realize a requisio da mesma atravs de um Web Browser, para certificar-se que a mesma
vlida e que a definio WSDL est realmente publicada e acessvel sob o link informado.
64 Verso 12
Programao ADVPL WebService
Verso 12 65
Programao ADVPL WebService
Neste processamento, caso uma seo de mensagens (message) seja especificada para uma operao, porm no
seja encontrada no WSDL, o mesmo considerado invlido, e o processo de gerao abortado com a mensagem
acima, identificando a mensagem no encontrada em [MSG_INFO]. Caso a informao [MSG_INFO] estiver vazia, o
documento WSDL no especificou alguma mensagem de parmetro ou retorno na seo <portType> da lista de
mtodos do WSDL.
Neste processamento, caso uma seo de amarrao (binding) no seja localizada para uma operao especificada no
WSDL, e a mesma no seja encontrada no WSDL, o mesmo considerado invlido, e o processo de gerao
abortado com a mensagem acima, identificando a mensagem no encontrada em [BIND_INFO].
Quando iniciado este processamento, verificado se o documento WSDL contm a definio do NameSpace de
destino (TargetNameSpace) utilizado. Caso este no seja localizado, o WSDL considerado invlido, e o processo de
gerao abortado com a mensagem acima.
Quando iniciado este processamento, caso uma operao/mtodo do WebService no seja encontrada na seo de
amarrao (binding), o documento WSDL considerado invlido, e o processo de gerao abortado com a
mensagem acima, identificando a operao no encontrada em [OPER_INFO].
66 Verso 12
Programao ADVPL WebService
Neste processamento, caso uma operao/mtodo do WebService no seja encontrada na seo de portas do WSDL
( PortType ), o documento WSDL considerado invlido, e o processo de gerao abortado com a mensagem acima,
identificando a porta no encontrada em [PORT_INFO].
Neste processamento, caso uma operao/mtodo do WebService no contenha a definio das operaes na seo
de portas do servio (PortType), o documento WSDL considerado invlido, e o processo de gerao abortado com a
mensagem acima, identificando a porta sem definio em [PORT_INFO].
Quando iniciado este processamento, caso uma determinada estrutura seja identificada como sendo externa ao
WSDL atual, referenciada por um IMPORT ou REF ou se a estrutura estiver declarada no WSDL sem o referido
namespace, o WSDL considerado invlido, e o processo de gerao abortado com a mensagem acima,
identificando a estrutura incompleta em [STRUCT_NAME].
Verso 12 67
Programao ADVPL WebService
Complementar ao erro WSCERR032, este reproduzido quando o namespace identificado para o parmetro seja
externo ao WSDL, porm a URL para processamento do mesmo no seja especificada atravs de um Import no WSDL.
Neste caso, o WSDL considerado invlido, e o processo de gerao abortado com a mensagem acima,
identificando o namespace no encontrado em [LONG_NAMESPACE]
Complementar ao erro WSCERR033, este ocorre quando a declarao da URL/Location do NameSpace externo no
esteja declarada no <IMPORT...> do WSDL . Neste caso, o documento considerado invlido, e o processo de
gerao abortado com a mensagem acima, identificando o namespace incompleto em [INFO_NS].
Quando iniciado o processamento de estruturas pendentes, identificadas como sendo externas ao WSDL atual,
especificadas por um IMPORT ou REF, o namespace da mesma identificado e importado, e todo o WSDL re-
processado. No reprocessamento, caso o parmetro/estrutura pendente no seja encontrado, o WSDL considerado
invlido, e o processo de gerao abortado com a mensagem acima, identificando a estrutura pendente em [TYPE].
Na validao de estruturas complexas, se a mesma no possuir tipo definido, e no for uma referncia externa ao
WSDL, ela deve ser uma referncia ao prprio SCHEMA. Caso seja especificada qualquer outro tipo de referncia, o
WSDL no suportado, e o processo de gerao abortado com a mensagem acima.
Na validao de estruturas complexas, caso a mesma tenha passado por todas as interpretaes cabveis a uma
estrutura, e mesmo assim no foi possvel identific-la, o WSDL considerado invlido, e o processo de gerao
abortado com a mensagem acima, identificando a estrutura em [TYPE].
68 Verso 12
Programao ADVPL WebService
No processo de gerao, so analisados todos os parmetros e estruturas utilizadas pelos mtodos do servio, at que
todas as estruturas utilizadas sejam processadas. Quando da validao de estruturas complexas, caso uma estrutura
e/ou parmetro/retorno tenha passado por todas as interpretaes cabveis de uma estrutura, porm no foi possvel
localizar ou identificar adequadamente a estrutura, o WSDL considerado invlido, e o processo de gerao abortado
com a mensagem acima, identificando o parmetro de origem da mesma em [PARAM].
Em termos prticos, este erro singifica que : ou o WSDL fornecido no vlido, ou ento a engine de parser WSDL do
Protheus no reconheceu a estrutura como vlida, isto , no soube lidar com ela para gerar um fonte client AdvPL.
Verifique o cdigo-fonte da aplicao e certifique-se de sempre passar um Objeto XML ou Array para a funo
XMLDataSet().
Verifique o cdigo-fonte da aplicao e certifique-se de sempre passar um Objeto XML ou Array para a funo
XMLDataSchema().
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravps da funo GetWSCError().
Verso 12 69
Programao ADVPL WebService
No momento de postar o pacote SOAP de parmetros para um Web Service, verificada a propriedade reservada
_URL do objeto do Servio, que contm a URL para postagem do pacote ao servidor. Caso a mesma esteja vazia, o
processamento abortado com a mensagem acima, antes da postagem dos dados.
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravps da funo GetWSCError().
Verifique o cdigo-fonte, e certifique-se que, caso a propriedade _URL esteja sendo redefinida, a mesma no esteja
vazia. Esta propriedade j alimentada automaticamente pelo engine client de webservices, de acordo com as
informaes para postagem obtidas no WSDL utilizado para a gerao do cdigo-fonte client.
No momento de postagem do pacote SOAP de parmetros para um Web Service, verificado o formato do pacote
SOAP a ser enviado ao client. Esta propriedade definida em fonte, no momento da gerao do fonte-client, e no
deve ser alterada. Caso a mesma seja alterada manualmente, e no esteja num formato vlido, o processamento
abortado com a mensagem acima, antes da postagem dos dados, indicando em [SOAP_STYLE] o soap style invlido
informado..
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravps da funo GetWSCError().
Verifique o cdigo-fonte, e certifique-se que o mesmo no foi alterado automaticamente pelo engine client de
webservices, de acordo com as informaes para postagem obtidas no WSDL utilizado para a gerao do fonte client.
Aps montado o pacote de envio para a solicitao de processamento do servio, este postado no servidor indicado
na URL especfiicada no servio. Caso o servidor de destino do pacote no seja localizado no DNS, ou no esteja no ar,
o processamento abortado com a mensagem acima, e a URL de destino especifiacada em [URL_POST].
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
70 Verso 12
Programao ADVPL WebService
Aps montado o pacote de envio para a solicitao de processamento do servio, o pacote enviado a URL
discriminada no servio.
Diferentemente da ocorrncia WSCERR014, esta ocorrncia pode ser reproduzida quando o servidor de WebServices
que atendeu requisio foi localizado, a requisio foi feita com sucesso, porm o servidor do sistema recebeu como
retorno um pacote HTTP incompleto ou invlido, ou ocorreu um erro interno no servidor, referenciado no header do
pacote HTTP; nestes casos o processamento abortado com a ocorrncia acima, informando em <URL> o endereo
do servidor onde o dado foi postado, e, se disponvel, em HEADER_RET informado o contedo do Header de Retorno
do HTTP.
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
Aps montado e enviado o pacote de envio para a solicitao de processamento do servio, o pacote SOAP retornado
pelo servio analisado para a alimentao dos parmetros AdvPL. Caso seja detectada alguma inconsistncia,
considerada pelo parser interno de xml do sistema como uma advertncia (warning), no documento XML, o pacote
SOAP de retorno considerado invlido, e o processamento abortado com esta ocorrncia, informando em
XML_WARNING a mensagem de advertncia do parser interno; e em <URL> o servidor de WebServices que retornou o
pacote.
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
Aps montado e enviado o pacote de envio para a solicitao de processamento do servio, o pacote SOAP retornado
pelo servio analisado para a alimentao dos parmetros AdvPL. Caso seja detectada alguma inconsistncia,
considerada pelo parser interno de xml do sistema, como um erro de sintaxe no XML, o pacote SOAP de retorno
considerado invlido, e o processamento abortado com esta ocorrncia, informando em XML_ERROR a mensagem
de erro do parser interno; e em <URL> o servidor de WebServices que retornou o pacote.
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError(). Veja mais detalhes na
funo GetWSCError(), pois ela oferece a possibilidade de recuperar os elementos principais de retorno de um pacote
SOAP_FAULT isoladamente.
Verso 12 71
Programao ADVPL WebService
Ao analisar o pacote SOAP retornado pelo servio, para a alimentao dos parmetros AdvPL, caso o pacote de
retorno contenha uma excesso do tipo SOAP FAULT, isto indica que houve uma falha de processamento do servio
no servidor.
O processamento abortado com esta ocorrncia, informando em [FAULT_CODE] o cdigo da excesso SOAP, em
<URL> o servidor de WebServices que retornou o pacote, e em FAULT_STRING mais detalhes sobre a ocorrncia.
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
WSCERR049 / SOAP RESPONSE (RPC) NOT FOUND.
Esta ocorrncia reproduzida, quando da utilizao de um cdigo-fonte Client de WebServices, ao processar o pacote
SOAP recebido como retorno da ao/mtodo solicitado.
Ao analisar o pacote SOAP retornado pelo servio, para a alimentao dos parmetros AdvPL, caso o servio utilize
um soapStyle = RPC, e o node de resposta no seja encontrado no pacote, o pacote de resposta considerado
invlido, e o processamento abortado com a mensagem acima.
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
Ao analisar o pacote SOAP retornado pelo servio, para a alimentao dos parmetros AdvPL, caso o servio utilize um
SoapStyle = RPC, e o node de resposta aponte para um outro node via referncia, e este novo node no seja
encontrado no pacote, o pacote considerado invlido e o processamento abortado com a mensagem acima,
mostrando o identificador de referncia no encontrado em <NODE_REF>.
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
72 Verso 12
Programao ADVPL WebService
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
Antes da montagem do pacote SOAP, os parmetros do mtodo/ao solicitada do servio so analisados e validados.
Caso um parmetro contiver uma definio de enumeration, obtida no WSDL, e for alimentado pelo cdigo-fonte
client com um valor que no conste na lista de parmetros vlidos, o processamento abortado com a mensagem
acima, identificando o parmetro envolvido em [STRUCT_TYPE].
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
Verifique o cdigo-fonte client gerado em AdvPL, para obter a lista de parmetros vlidos; e certifique-se que o
parmetro especificado est alimentado de forma correta.
Ao analisar o pacote SOAP retornado pelo servio, para a alimentao dos parmetros AdvPL, caso o servio utilize um
soapStyle = RPC. No momento de anlise de um retorno de uma estrutura complexa, se o node correspondente
estrutura no for localizado no pacote de retorno, o mesmo considerado invlido, e o processamento abortado com
a mensagem acima.
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
Durante a gerao do cdigo-fonte, uma vez identificado o servio, o gerador de cdigo procura a declarao das
amarraes do servio (BINDINGS) no WSDL. Dentre as amarraes encontradas, apenas so processadas aquelas
que especificam o transporte de dados para o servio no formato SOAP.
Caso no exista nenhuma amarrao no servio, que especifique a utilizao do SOAP, o processo de gerao do
cdigo-fonte client abortado, retornando esta ocorrncia. A infraestrutura Client de WebServices do sistema no
suporta a gerao de fontes-client de servios que no utilizem pacotes XML - SOAP para a troca de informaes.
Verso 12 73
Programao ADVPL WebService
Antes da montagem do pacote SOAP, os parmetros do mtodo/ao solicitada do servio so analisados e validados.
As propriedades da classe, utilizadas como parmetros, devem ser alimentadas com os tipos AdvPL apropriados. Caso
uma determinada propriedade [PARAM] do objeto 'Client' do servio esteja alimentada com um tipo de dado Advpl [X] ,
porm o tipo esperado era [Y], o processamento abortado com a ocorrncia de erro acima.
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
Verifique o cdigo-fonte client gerado em AdvPL, e certifique-se que o parmetro especificado est sendo alimentado
de forma correta, com o tipo apropriado.
Ao analisar o pacote SOAP retornado pelo servio, caso o mesmo no contenha um envelope (soap-Envelope) de
resposta, o retorno considerado invlido, e o processamento abortado com a mensagem acima.
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
Ao analisar o pacote SOAP retornado pelo servio, caso no seja possvel determinar o prefixo do SOAP Envelope
utilizado, o retorno considerado invlido, e o processamento abortado com a mensagem acima.
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
Ao analisar o pacote SOAP retornado pelo servio, caso o soap-envelope determinado [SOAP_ENV], esperado como
um Objeto, foi recebido com um tipo AdvPL [X]. Isto invalida o pacote soap recebido, sendo o processamento abortado
com a ocorrncia acima.
74 Verso 12
Programao ADVPL WebService
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
71. WSCERR061 / Invalid XML-Soap Server Response: Invalid soap-body [BODY] object
as valtype [TYPE]
Ocorre na utilizao de um cdigo-fonte Client de WebServices, ao iniciar o processamento do pacote SOAP recebido
como retorno da ao/mtodo solicitado.
Semelhante a ocorrncia WSCERR058, esta ocorrncia indica que no SOAP retornado, o corpo (soap-body)
determinado [BODY], esperado como um Objeto, foi recebido como um tipo AdvPL [TYPE], ; o que invalida o pacote de
retorno, sendo o processamento abortado com esta ocorrncia de erro.
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
72. WSCERR062 / Invalid XML-Soap Server Response: Unable to determine Soap Prefix
of Envelope [SOAP_ENV]
Esta ocorrncia reproduzida na utilizao de um cdigo-fonte Client de WebServices, ao iniciar o processamento do
pacote SOAP recebido como retorno da ao/mtodo solicitado.
Esta ocorrncia indica que, no SOAP retornado, o envelope (soap-envelope) determinado [SOAP_ENV], no est em
um formato que seja possvel determinar o nome do envelope; o que invalida o pacote de retorno, sendo o
processamento abortado com esta ocorrncia de erro.
Verso 12 75
Programao ADVPL WebService
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
Esta ocorrncia indica que o parmetro obrigatrio determinado em [NODE], com o tipo [TYPE], no foi alimentado para
a chamada da funo client. Esta ocorrncia invalida a montagem do pacote de envio, abortando o processamento
antes do envio do pacote.
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
Esta ocorrncia indica que, o header HTTP de retorno do servio, postado em <URL>, veio com o contedo do
header HTTP retornado pelo servidor, indica o uso de content-type diferente de XML, o que invalida o processamento
do retorno. Um Web Service client sempre espera por um pacote de retorno com um 'Content-type: text/xml' de um
Web Services SERVER.
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
Esta ocorrncia normalmente reproduzida, quando um determinado WebService no est mais publicado no endereo
especificado, porm a URL ainda vlida. De modo que, ao receber a requisio, o servidor devolve uma pgina
HTML, com uma mensagem do tipo 'Page not Found'.
Semelhante a ocorrncia WSCERR064, esta ocorrncia indica que, aps a postagem de um pacote SOAP ao servidor
de destino do WebService, em <URL>, o contedo do header HTTP retornado (HEADER) retornado pelo servidor, no
possua a identificao do Content-Type, o que invalida o processamento de retorno. O client AdvPL sempre espera por
um pacote de resposta com um content-type: text/xml como retorno.
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
76 Verso 12
Programao ADVPL WebService
Esta ocorrncia indica que, o header HTTP de retorno da requisio do WSDL, solicitado no endereo <URL>, veio
identificando um tipo de documento (content-type) diferente de textp/plain ou text/xml, o que invalida o processamento
do retorno. Um Web Service client sempre espera por um pacote de retorno com um 'Content-type: text/xml' ou
'text/plain', de um Web Services SERVER.
Esta ocorrncia normalmente reproduzida quando um determinado WebService no est mais publicado no endereo
especificado, porm o servio de HTTP ainda est ativo no servidor solicitado. De modo que, ao receber a requisio, o
servidor devolve uma pgina HTML, com uma mensagem do tipo 'Page not Found'.
Caso o WSDL possa ser aberto atravs de um navegador de internet (Internet Explorer, Mozilla Firefox, etc), proceda
da seguinte forma:
Esta ocorrncia indica que, o header HTTP de retorno do WSDL, solicitado atravs do link <URL>, veio com o contedo
do header HTTP sem a informao do tipo de contedo do documento (content-type). Um documento WSDL deve ser
retornado pelo servidor de WebServices, informando no header HTTP um tipo de documento (content-type) definido
como text/plain ou text/xml.
Esta ocorrncia indica que, o documento retornado pelo servidor de Web Services no se trata de um XML vlido para
ser analizado. O documento WSDL deve sempre iniciar com o node da declarao do XML ( <?XML ...) . Caso no
possua esta informao, o primeiro node deve obrigatoriamente ser a definio do servio ( <DEFINITIONS ). Se o
documento WSDL retornado no atender estes requisitos, o processamento abortado com a mensagem acima.
Verso 12 77
Programao ADVPL WebService
No momento da gerao do cdigo-fonte, caso o WSDL retornado informe um mtodo de Web Services, que possua
mais de um parmetro de retorno, isto caracteriza um mtodo que trabalha com parmetros por referncia (BYREF).
Neste caso, aps o cruzamento dos retornos do mtodo com os parmetros, deve restar no mximo um retorno. Caso
mesmo assim, reste mais de um retorno, o WSDL considerado invlido, sendo o processo de gerao abortado com a
mensagem de erro acima, informando em [PARAM] o retorno excedente, que deveria ser localizado nos parmetros.
No momento de postar o pacote SOAP de parmetros para um Web Service, verificado se o protocolo em uso o
HTTPS e se o mesmo j suportado pela Build atual do servidor TOTVS | Application Server em uso.
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
Verifique o cdigo-fonte, e certifique-se que, caso a propriedade _URL esteja sendo redefinida, a mesma no esteja
sendo redefinida para um endereo utilizando HTTPS. Caso a propriedade _URL no esteja sendo re-definida, e o
servio solicitado exiga o envio dos dados atravs de HTTPS, a build do servidor TOTVS | Application Server deve ser
atualizado.
Ocorre na gerao de cdigos-fonte AdvPL, caso o servidor informado, acessado via URL, retorne um pacote HTTP,
com um header de retorno que no seja identificado como HTTP, o processo de gerao abortado com a ocorrncia
acima, informando em <httphead> o header informado, e em <url> o endereo informado para a solicitao do WSDL.
Dentre as possveis causas, podemos considerar que a URL informada no corresponde a um servidor HTTP ou de
WEB SERVICES. Para certiticar-se da ocorrncia, abra a URL especificada utilizando um Web Browser.
Se d caso o servidor informado, acessado via URL, retorne um pacote HTTP, com um header de retorno HTTP, porm
com um status diferente de 200 (OK). O processo de gerao abortado com a ocorrncia acima, informando em
<HEADER> a primeira linha do cabealho HTTP retornado, e em <url> o endereo informado para a solicitao do
WSDL.
78 Verso 12
Programao ADVPL WebService
Dentre as provveis causas, podemos considerar os status de retorno '403 Forbidden', retornados por proxys que
requerem autenticao ou no permitem o acesso url especificada, o '500 Internal Server Error', que indica uma
ocorrncia interna de erro no servidor, que impossibilitou o retorno do WSDL.
O pacote SOAP retornado pelo servio analisado para a alimentao dos parmetros AdvPL. em primeiro momento,
so realizadas as consistncias de cabeaho de protocolo (header) , e em seguida o pacote SOAP desmontado por
um parser interno do TOTVS | Application Server, onde verificada a sintaxe do documento XML ( Veja ocorrncias
WSCERR046 e WSCERR047 ), e a resultante deste processo ser um objeto intermedirio.
Somente se o contedo SOAP retornado pelo servio, contenha um erro estrutural ou sinttico, que no seja detectado
pelo parser interno como um erro ou advertncia, este objeto intermedirio no gerado, o que impossibilita a rotina de
prosseguir o processamento. Esta ocorrncia j foi reproduzida anteriormente, em builds do TOTVS | Application
Server anteriores Dezembro/2003. Em releases posteriores a este, o tratamento dos pacotes de retorno do servio foi
revisado; desde ento esta ocorrncia no mais foi reproduzida.
Esta ocorrncia capturada pelo prprio cdigo-fonte do mtodo, sendo que o mtodo 'Client' chamado retornar .F.
(falso), e a descrio da ocorrncia deve ser recuperada atravs da funo GetWSCError().
Regras para Nomenclatura dos Servios / Estruturas / Dados eMtodos
Deve ser iniciado por um caracter alfabticodevendo conter apenas os caracteres alfabticos compreendidos entre A...
Z , os caracteres numricos compreendidos entre 0 ... 9 , podendo tambm ser utilizado o caractere _ (underline ) .
Um servio no pode ter um nome de umapalavra reservada Advpl , e no pode ter o nome igual a um tipo bsico
decampo ( STRING , INTEGER , FLOAT , DATE , BOOLEAN ) .
Uma estrutura um agrupamento de dados bsicos, criado como uma classe especial (WSSTRUCT) em Advpl.
Procedemos com a criao de uma estrutura para um servio quando temos a necessidade de definir que um conjunto
de dados bsicos pode ser agrupado em um tipo de informao (que ser utilizada como parmetro e/ou retorno em um
ou mais mtodos do servio).
Verso 12 79
Programao ADVPL WebService
<Nome_Campo>
Obedece s mesmas regras de nomenclatura de Servios, no podendo haver um dado com o mesmo nome de um
servio ou estrutura j declarados.
[ARRAY OF]
Caso especificado , indica que este dado poder ter mais de uma ocorrncia , sendo tratado como um Array em Advpl .
<Tipo_Campo>
Pode ser um tipo bsico de dado (String , Date ,Integer, Float, Boolean ) , ou pode ser uma estrutura declarada .
[OPTIONAL]
Caso especificado , indica que a especificao deste dado nos pacotes de envio e/ou retorno opcional.
*** Restries de uso da instruo ARRAY OF: No permitido o uso da instruo ARRAY OF quando declaramos
dados utilizados para entrada dedados dentro da declarao do servio. Para tal, precisamos criar uma estrutura
intermediria para encapsular o array.
Por default, um campo declarado sem a clusula OPTIONAL obrigatrio. Sendo obrigatrio, isto significa que o node
ou tag SOAP referente ao mesmo dever ser especificado no pacote XML - Soap onde o campo for utilizado seja ele
um parmetro ou retorno.
No processamento de um servio, os dados enviados pelo client como parmetrona requisio so lidos do pacote
SOAP e atribuidos s propriedades do mtodo do respectivo servio, e caso um dado no seja passado ao servio,
atribudo ao mesmo o contedo NIL.
80 Verso 12
Programao ADVPL WebService
<Metodo>
Obedece s mesmas regras de nomenclatura de Servios, no podendo haver um servio ou estrutura declarados com
o mesmo nome.
Ao declarar o mtodo, obrigatoriamente devemos especificar um ou mais campos declarados dentro do servio a ser
utilizado para a entrada de dados, e apenas um campo para sada de dados do mtodo.
Os campos podem ser de tipos bsicos ou estruturas. Dentro do mtodo, fazemos referncias s propriedades da
estrutura, segundo a nomenclatura de acesso propriedades de objetos Advpl (prefixo::).
Caso desejemos declarar um servio que no requer nenhum parmetro, devemos especificar que o mesmo recebe o
parmetro reservado NULLPARAM.
Verso 12 81