Exemplo de montagem de serviço de WS com métodos e atributos para importação, processamento ou exportação de dados em AdvPL.
Exemplo da Rotina:
WSSERVICE [Nome do WS] DESCRIPTION "Descricao do WS" //Atributos WSDATA [Atributo 1] as String WSDATA [Atributo 2] as String WSDATA [Atributo ...] as String //Métodos WSMETHOD [Metodo 1] DESCRIPTION "Descricao do Metodo" WSMETHOD [Metodo 2] DESCRIPTION "Descricao do Metodo" WSMETHOD [Metodo ...] DESCRIPTION "Descricao do Metodo" ENDWSSERVICE WSMETHOD [Metodo] WsReceive [Atributo de Recebimento] WsSend [Atributo de Envio] WsService [Nome do WS] //Processamento Return .T.
Exemplo 1- Importação de XML ou JSON em AdvPL:
//Bibliotecas #Include "Protheus.ch" #Include "APWebSrv.ch" #Include "TBIConn.ch" #Include "TBICode.ch" #Include "TopConn.ch" #Include "aarray.ch" #Include "json.ch" #Include "shash.ch" /* Para testar o consumo dos métodos diretamente no Protheus, é necessário criar uma User Function User Function zTstWS() Local aArea := GetArea() ... oWsTst := WsTeste():ImpXML(cXml) ... RestArea(aArea) Return */ WSSERVICE WsTeste DESCRIPTION "WebService de testes" //Atributos WSDATA cDadXML as String WSDATA cMsgXML as String WSDATA cDadJSON as String WSDATA cMsgJSON as String //Métodos WSMETHOD ImpXML DESCRIPTION "Método de importação de XML" WSMETHOD ImpJSON DESCRIPTION "Método de importação de JSON" ENDWSSERVICE //Importação de XML /* Exemplo de XML: "<?xml version='1.0'?> <Cadastro> <Numero>000000</Numero> <Nome>Teste</Nome> </Cadastro>" */ WSMETHOD ImpXML WsReceive cDadXML WsSend cMsgXML WsService WsTeste Local cNumero := "", cNome := "" Local oArq, oCad Local cAviso := "", cErro := "" ConOut("Inicio ImpXML: "+Time()) //Convertendo o xml para objeto, e pegando o nó de cadastro cDadXML := FWNoAccent(::cDadXML) oArq := XmlParser(cDadXML, "_", @cAviso, @cErro) oCad := oArq:_Cadastro //Pegando os atributos de número e nome cNumero := oCad:_Numero:TEXT cNome := oCad:_Nome:TEXT DbSelectArea("ZZ1") ZZ1->(DbSetOrder(1)) //Filial + Numero //Se não encontrar o numero, importa o novo registro If ! ZZ1->(DbSeek(FWxFilial('ZZ1') + cNumero)) RecLock('ZZ1', .T.) ZZ1_FILIAL := FWxFilial('ZZ1') ZZ1_NUMERO := cNumero ZZ1_NOME := cNome ZZ1->(MsUnlock()) ::cMsgXML := "Registro importado ("+cNumero+")!" Else ::cMsgXML := "Registro ja existe ("+cNumero+")!" EndIf ConOut("Termino ImpXML: "+Time()) Return .T. //Importação de JSON /* Exemplo de JSON: {"Cadastro": { "Numero": "000000", "Nome": "Teste" }} */ WSMETHOD ImpJSON WsReceive cDadJSON WsSend cMsgJSON WsService WsTeste Local cNumero := "", cNome := "" Local oArq, oCad Local cAviso := "", cErro := "" ConOut("Inicio ImpJSON: "+Time()) //Deserializando o JSON If (FWJsonDeserialize(::cDadJSON, @oArq)) oCad := oArq:Cadastro //Pegando os atributos de número e nome cNumero := oCad:_Numero cNome := oCad:_Nome DbSelectArea("ZZ1") ZZ1->(DbSetOrder(1)) //Filial + Numero //Se não encontrar o numero, importa o novo registro If ! ZZ1->(DbSeek(FWxFilial('ZZ1') + cNumero)) RecLock('ZZ1', .T.) ZZ1_FILIAL := FWxFilial('ZZ1') ZZ1_NUMERO := cNumero ZZ1_NOME := cNome ZZ1->(MsUnlock()) ::cMsgJSON := "Registro importado ("+cNumero+")!" Else ::cMsgJSON := "Registro ja existe ("+cNumero+")!" EndIf Else SetSoapFault('Erro', 'JSON nao deserializado!') Return .F. EndIf ConOut("Termino ImpJSON: "+Time()) Return .T.
Exemplo em Vídeo:
Clique nesse link para ver um exemplo em Vídeo da nossa Maratona de Exemplos.
Observações:
– Caso tenha dúvidas ou problemas com os exemplos, entre em contato;
– Se tiver sugestões de rotinas, pode entrar em contato;
– Caso você precise fazer o download das bibliotecas aarray.ch, json.ch e shash.ch, acesse Pacotão de Includes
Referências:
– leonardods
– TDN – Web Services REST
– TDN – FWJsonDeserialize
– TDN – XMLParser
– Tudo em AdvPL