Histórico da Página
...
A classe trabalha com 2 tipos de dados: os tipos complexos, que são as seções do XML, e os tipos simples, que são as tags que recebem valor. Por exemplo, numa operação de inserção de clientes, a tag "cliente" é um tipo complexo, pois contém os dados do cliente dentro, e as uma a tag "nome" é um tipo simples, pois recebe diretamente um valor (no caso, o nome do cliente).
...
- Através do método SimpleInput, a classe irá disponibilizar uma lista com os elementos que serão definidos na mensagem SOAP que será enviada. A lista possui o nome dos elementos e o id interno deles. Logo, para definir o valor de um elemento utiliza-se o id do mesmo. Mas é possível também definir o valor passando o nome do elemento, fazendo com que a classe procure o mesmo, seja o primeiro encontrado (métodos SetFirst ou SetFirstArray) ou de acordo com os elementos pai (métodos SetValPar ou SetValParArray), e defina seu valor.
- WSDL - Web Services Description Language (Linguagem para descrição de web services) é uma linguagem baseada em XML para descrição dos serviços, operações e métodos de um web service. O documento gerado a partir do documento WSDL é no formato SOAP. Para mais informações sobre WSDL acesse o endereço: http://www.w3.org/TR/wsdl.
- SOAP - Simple Object Access Protocol (Protocolo Simples de Acesso a Objetos) é um protocolo baseado em XML para troca de informações estruturadas em plataforma descentralizada e distribuída, normalmente web services. Para mais informações acesse: http://www.w3.org/TR/soap/.
- Para saber como habilitar e configurar o módulo no Protheus, acesse: https://tdn.totvs.com/display/public/PROT/Configurar+Portais+e+Webservices
- Para obter mais informações dos modelos regulamentados pela W3C - World Wide Web Consortium, acesso o endereço: http://www.w3c.org.
- Alguns endereços com tutoriais sobre as tecnologias envolvidas podem ser acessados em http://www.w3schools.com/ e http://www.tutorialspoint.com/.
Exemplos
Exemplo 1.A - Cria um WebService Agenda com elementos complexos
Envio e recebimento de mensagens
A classe TWsdlManager está preparada para enviar e receber mensagens apenas no formato SOAP. O envio das mensagens é feito através do método SendSoapMsg, que por padrão monta automaticamente a mensagem com base nos valores definidos antes do envio, ou envia uma mensagem já definida em uma variável CARACTERE passada por parâmetro.
Ao receber a resposta, que deve estar no formato SOAP também, a classe irá fazer o parse da mensagem e gera uma resposta pré-formatada. Para desabilitar o processamento da mensagem de resposta deve-se definir a propriedade lProcResp com o valor .F. (falso) antes do envio da mensagem ao servidor. Essa definição pode ser feita apenas uma vez. A resposta SOAP recebida pela classe pode ser obtida através do método GetSoapResponse e a resposta pré-formatada através do método GetParsedResponse.
Caso a propriedade lProcResp tenha o valor .F. (falso), a resposta pré-formatada não será gerada e o método GetParsedResponse irá retornar uma string vazia. Além disso, será necessário tratar manualmente a resposta recebida, que pode ser obtida pelo método GetSoapResponse.
O método SendSoapMsg irá retornar apenas após receber a mensagem de resposta e fazer ou não o parse. Caso esteja fazendo o parse da resposta e dê algum erro no parse, mesmo que o envio e recebimento das mensagens tenha sido feito com sucesso, o método irá retornar .F. (falso). Contudo, caso não esteja fazendo o parse de resposta e seja recebido uma resposta do tipo SOAP Fault, o método irá retornar .T. (verdadeiro), pois o envio e recebimento de mensagens foi feito com sucesso.
Exemplos
Exemplo 1.A - Cria um WebService Agenda com elemento complexo
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
Bloco de código | ||||||||
| ||||||||
#include "protheus.ch" #include "apwebsrv.ch" WSSTRUCT Contato WSDATA Nome AS String WSDATA Telefone AS String OPTIONAL ENDWSSTRUCT WSSTRUCT Contatos WSDATA Registros AS ARRAY OF Contato ENDWSSTRUCT WSSERVICE Agenda WSDATA _status AS Boolean WSDATA _dados AS Contatos WSMETHOD InsereContatos WSMETHOD ListaContatos ENDWSSERVICE WSMETHOD InsereContatos WSRECEIVE _dados WSSEND _status WSSERVICE Agenda Local nI // Exibe os dados recebidos. Eles seriam inseridos em umuma tabela de numum banco de dados. for nI := 1 to Len( ::_dados:Registros ) conout( "Registro " + cValToChar( nI ) ) conout( "Nome: " + ::_dados:Registros[nI]:Nome ) conout( "Telefone: " + IIf( Empty( ::_dados:Registros[nI]:Telefone ), "Nao tem", ::_dados:Registros[nI]:Telefone ) + CRLF ) next nI // Devove um status informando que a operação foi feita com sucesso. Esse status será devolvido na mensagem SOAP de resposta a esse método. ::_status := .T. // Retorna que a operação foi feita com sucesso para a camada do Protheus. Return .T. WSMETHOD ListaContatos WSRECEIVE NULLPARAM WSSEND _dados WSSERVICE Agenda Local nDay := dow( date() ) Local oNewContato if nDay == 1 .Or. nDay == 7 SetSoapFault( "Metodo não disponível", "Este serviço não funciona no fim de semana." ) return .F. endif // Os dados de retorno seriam pegos do banco de dados. // Para esse exemplo iremos popular o retorno com dados fixos. // Cria a instância de retorno ( WSDATA _dados AS Contatos ) ::_dados := WSClassNew( "Contatos" ) // inicializa a propriedade da estrutura de retorno // WSDATA Registros AS ARRAY OF Contato ::_dados:Registros := {} // Cria e alimenta uma nova instancia do Contato oNewContato := WSClassNew( "Contato" ) oNewContato:Nome := "Fulano" oNewContato:Telefone := "98765" AAdd( ::_dados:Registros, oNewContato ) // Cria e alimenta uma nova instancia do Contato oNewContato := WSClassNew( "Contato" ) oNewContato:Nome := "Ciclano" oNewContato:Telefone := "95678" AAdd( ::_dados:Registros, oNewContato ) varInfo("listaContatos", ::_dados:Registros) // Retorna que a operação foi feita com sucesso para a camada do Protheus. Return .T. |
...