PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → Windev Mobile - Criando um Webservice usando SOAP medodo "Post" (Envelope Xml)
Windev Mobile - Criando um Webservice usando SOAP medodo "Post" (Envelope Xml)
Débuté par adrianoboller, 03 déc. 2014 16:24 - 2 réponses
Membre enregistré
3 651 messages
Popularité : +175 (223 votes)
Posté le 03 décembre 2014 - 16:24
Membre enregistré
3 651 messages
Popularité : +175 (223 votes)
Posté le 09 décembre 2014 - 16:38
Procedure WS_Taxi_Disponivel(LOCAL DebugSN)

//Foi trash mas funciona em 2 segundos tem todos os taxis de curitiba
//Para plotar na tela vamos usar uma procedure local na tela do mapa
//usamos a queue para poder ter os dados armazenados e usados entre procedures


//Variaveis
ok, bRet is boolean = False

nRetornoCodigo is int = 0

nContador is int = 0

CodClienteCelula is string = ""

XML_Retorno is string = ""

LocSt_TaxisLogados is ST_TaxisLogados

IpSaladaFruta01 is string = Morango_01 +"."+ Abacaxi_02 +"."+ Limao_03 +"."+ Melancia_04 +":"+ Laranja_05

IpSaladaFruta02 is string = Morango_01 +"."+ Abacaxi_02 +"."+ Limao_03 +"."+ Melancia_04 +":"+ Manga_06

//Modelo a ser seguido:

//####ENVELOPE DE ENVIO#### ----->
//<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
//xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
//xmlns:urn="urn:act297_RtPlusSSDM-IRtPlusSSDM">
//<soapenv:Header/>
//<soapenv:Body>
//<urn:ObterRelacaoDeVeiculosLogados soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
//<cod_client_celula xsi:type="xsd:int">1</cod_client_celula>
//<dat_hora_proces xsi:type="xsd:string">2014-06-30T15:01:24</dat_hora_proces>
//<num_proces xsi:type="xsd:int">1617</num_proces>
//</urn:ObterRelacaoDeVeiculosLogados>
//</soapenv:Body>
//</soapenv:Envelope>



//####ENVELOPE DE RETORNO#### <---- ta aqui o que vem, um bloco confuso que no loop so vai atrapalhar
//<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
//xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
//xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
//<SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
//xmlns:NS1="urn:act297_RtPlusSSDM-IRtPlusSSDM" xmlns:NS2="urn:act297_RtPlusSSDM">
//<NS1:ObterRelacaoDeVeiculosLogadosResponse>
//<return href="#1"/>
//</NS1:ObterRelacaoDeVeiculosLogadosResponse>
//<NS2:TVeiculosLogadosResult id="1">
//<ArrayVeiculosLogados>
//<item href="#2"/>
//</ArrayVeiculosLogados>
//</NS2:TVeiculosLogadosResult>
//<NS2:TVeiculoLogadoVO id="2">
//<NumUnidad>4</NumUnidad>
//<ValLatitu>-25.468</ValLatitu>
//<ValLongit>-49.227</ValLongit>
//<IdeStatus>0</IdeStatus>
//</NS2:TVeiculoLogadoVO>
//<NS2:TVeiculoLogadoVO id="3">
//<NumUnidad>10</NumUnidad>
//<ValLatitu>-25.39272</ValLatitu>
//<ValLongit>-49.183008</ValLongit>
//<IdeStatus>0</IdeStatus>
//</NS2:TVeiculoLogadoVO>
//</SOAP-ENV:Body>
//</SOAP-ENV:Envelope>


//SEM ACENTO
ChangeCharset(charsetOccidental)

//Busca Cliente pelo codigo como só tem um usuario cadastrado no aplicativo o codigo é 1
HReadSeekFirst(t001_cliente,t001_cliente.t001_seq_cliente,1)
IF HFound(t001_cliente) = True AND t001_cliente.t001_cod_clientecelula > 0 THEN

//Registro localizado
CodClienteCelula = t001_cliente.t001_cod_clientecelula

//Toquen de conexao
//NumProcess = TOQUEN de conexao - codigo validador parecido calculo do cnpj, mas nao é, apenas parecido
NumProces is string = WS_Taxi_ValidaRequisicao(t001_cliente.t001_ddd_telefone,...
t001_cliente.t001_num_telefone,...
0,...
0,...
"N")

//Envelope SOAP de envio// - recurso interessante no windev - string com texto com quebra de linha com definicao usando [ ] - #ObterRelacaoDeVeiculosLogados isso nao tem documentacao - mesmo o soapUi que mostrei nao coloca esse pedaço que defini o metodo usado no envelope, sem isso nao funciona
Xml_SEND is string = [
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:act297_RtPlusSSDM-IRtPlusSSDM#ObterRelacaoDeVeiculosLogados">
<soapenv:Header/>
<soapenv:Body>
<urn:ObterRelacaoDeVeiculosLogados soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<cod_client_celula xsi:type="xsd:int">V001</cod_client_celula>
<dat_hora_proces xsi:type="xsd:string">V002</dat_hora_proces>
<num_proces xsi:type="xsd:int">V003</num_proces>
</urn:ObterRelacaoDeVeiculosLogados>
</soapenv:Body>
</soapenv:Envelope>
]

//Replace dos dados do envelope pelos dados do cliente e código gerado pelo toquen
Xml_SEND = Clip(Replace(Xml_SEND,"V001",CodClienteCelula)) // cliente
Xml_SEND = Clip(Replace(Xml_SEND,"V002",GloDataHora)) // criada no toquen
Xml_SEND = Clip(Replace(Xml_SEND,"V003",NumProces)) // toquen


//Debug do que vai ser enviado (xml enviado).........................
IF DebugSN = "S" THEN
Info("/mnt/sdcard/TaxiFv/Arquivos/EnvioWSVersao.TXT", Xml_SEND) //Celular/tablet
IF InAndroidMode() = True
IF InSimulatorMode() = False THEN // nao é o simulador é o tablet ou o celular
fSaveBuffer("/mnt/sdcard/TaxiFv/Arquivos/EnvioWSVersao.TXT", Xml_SEND) // Local onde foi salvo o xml
ELSE
fSaveBuffer("c:\EnvioWSVersao.TXT", Xml_SEND) //PC local onde foi salvo o xml
END
END
END

//Definicao de um tempo maximo do httprequest - timeout aqui é 6000
//
HTTPTimeOut(GloHTTPTimeOut)

ok = HTTPRequest("http://"+IpSaladaFruta01+"/soap/IRtPlusSSDM","", "", Xml_SEND, "text/xml","","")


// ----------------------------------------------> XML_SEND = Envelope

//BASE TESTE - IPS ficticios nao sao validos
//ok = HTTPRequest("http://"+IpSaladaFruta02+"/soap/IRtPlusSSDM","", "", Xml_SEND, "text/xml","","")

IF ok = True //deu certo THEN

XML_Retorno = WS_Android_IOS_HTTPGetResult()

//
ok = False

//DEBUG - Arquivo Texto para Debug do que veio do servidor
IF DebugSN = "S"
Info("/mnt/sdcard/TaxiFv/Arquivos/RetornoWSVersaoSemTratamento.TXT",XML_Retorno) //celular ou tablet
IF InAndroidMode() = True
IF InSimulatorMode() = False THEN
fSaveBuffer("/mnt/sdcard/TaxiFv/Arquivos/RetornoWSVersaoSemTratamento.TXT", XML_Retorno) //local
ELSE
fSaveBuffer("C:\RetornoWSVersao.TXT", XML_Retorno) // pc onde tem o xml de retorno
END
END
END

XML_Retorno = WS_RemoveAcentos(XML_Retorno)////////////////////// ponto de entrada do codigo ios

IF Length(XML_Retorno) > 0 THEN

ArrayDeleteAll(arr_TaxisLogados) // limpa array

IF IniOSMode() = True THEN
/////////////////////////////////////////////////////////////

NoXml is string
i is int = 1

LOOP

NoXml = XMLExtractString(XML_Retorno,"NS2:TVeiculoLogadoVO",i)

IF NoXml = "" THEN
BREAK
END

LocSt_TaxisLogados.ST_ID = XMLExtractString(NoXml,"NumUnidad")
LocSt_TaxisLogados.ST_Latitude = XMLExtractString(NoXml,"ValLatitu",1)
LocSt_TaxisLogados.ST_Longitude = XMLExtractString(NoXml,"ValLongit",1)
LocSt_TaxisLogados.ST_Situacao = XMLExtractString(NoXml,"IdeStatus",1)

arr_TaxisLogados[LocSt_TaxisLogados.ST_ID] = LocSt_TaxisLogados

nContador ++
i++
ok = True

IF DebugSN = "S" THEN
Info(LocSt_TaxisLogados.ST_ID,LocSt_TaxisLogados.ST_Latitude,LocSt_TaxisLogados.ST_Longitude,LocSt_TaxisLogados.ST_Situacao)
END

END//loop

ELSE IF InAndroidMode() = True
/////////////////////////////////////////////////////////////

nInicial is int
nFinal is int
nInicial = PositionOccurrence(XML_Retorno,"<NS2:TVeiculoLogadoVO",firstRank,FromBeginning)
nFinal = PositionOccurrence(XML_Retorno,"</NS2:TVeiculoLogadoVO>",lastRank,FromEnd) +Length("</NS2:TVeiculoLogadoVO>")
XML_Retorno = Middle(XML_Retorno,nInicial,nFinal - nInicial)
XML_Retorno = Replace(XML_Retorno,"NS2:TVeiculoLogadoVO","NoXml")
XML_Retorno = "<Xml><Recorte>"+XML_Retorno+"</Recorte></Xml>"

//Ficou Glo_XML_Retorno assim:
//<Xml>
// <Retorno>
// <NoXml id="2">
//<numunidad>6</numunidad>
//<vallatitu>-25.448424</vallatitu>
//<vallongit>-49.285908</vallongit>
//<idestatus>1</idestatus>
//</NoXml>
// <NoXml id="3">
//<numunidad>7</numunidad>
//<vallatitu>-25.448424</vallatitu>
//<vallongit>-49.285908</vallongit>
//<idestatus>1</idestatus>
//</NoXml>
// </Retorno>
//</Xml>

//So pra ver se ligr o debug como ficou
IF DebugSN = "S" THEN
Info(XML_Retorno) // na tela
IF InAndroidMode() = True
fSaveBuffer("/mnt/sdcard/TaxiFv/Arquivos/RecorteBlocoLogados.TXT", XML_Retorno) //no arquivo
END
END

//Aqui é a definição de ler o xml e pegar os dados de cada taxi

//Leitura do xml
XmlDoc is XMLDocument

//Carrega o retornoc ajustado em um XmlDoc é uma string tomando formado de xml em um xmlDoc
XmlDoc = XMLOpen(XML_Retorno, fromString)

//Define o Nó Raiz de leitura - onde comeca e termina cada taxi a ser lido
NoXml is xmlNode

//Leitura do xml em loop--- aqui que o bicho pega e começa a ler
FOR EACH NoXml OF XmlDoc.Xml.Recorte on NoXml

//incluir registros na queue/
IF NoXml.NumUnidad <> Null AND NoXml.ValLatitu <> Null AND NoXml.ValLongit <> Null THEN

nContador += 1
ok = True
LocSt_TaxisLogados.ST_ID = NoXml.NumUnidad
LocSt_TaxisLogados.ST_Latitude = NoXml.ValLatitu
LocSt_TaxisLogados.ST_Longitude = NoXml.ValLongit
LocSt_TaxisLogados.ST_Situacao = NoXml.IdeStatus

//incluir - Add in Queue - incluir registro na queue // struct de memoria // tabela de memoria
arr_TaxisLogados[LocSt_TaxisLogados.ST_ID] = LocSt_TaxisLogados

END

END

END

END

END

END

//retorno da funcao é deu certo ou deu errado com true ou false
IF DebugSN = "S" THEN
Info("Qtde de Taxis Disponiveis:",nContador)
END

RESULT(ok)
Membre enregistré
3 651 messages
Popularité : +175 (223 votes)
Posté le 11 mai 2017 - 16:26




--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/