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 655 messages
Popularité : +175 (223 votes)
Posté le 03 décembre 2014 - 16:24
>
Membre enregistré
3 655 messages
Popularité : +175 (223 votes)
Posté le 09 décembre 2014 - 16:38
ProcedureWS_Taxi_Disponivel(LOCALDebugSN)

//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 isboolean=False

nRetornoCodigo isint=0

nContador isint=0

CodClienteCelula isstring=""

XML_Retorno isstring=""

LocSt_TaxisLogados is ST_TaxisLogados

IpSaladaFruta01 isstring=Morango_01+"."+Abacaxi_02+"."+Limao_03+"."+Melancia_04+":"+Laranja_05

IpSaladaFruta02 isstring=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)
IFHFound(t001_cliente) =TrueANDt001_cliente.t001_cod_clientecelula>0THEN

//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 isstring=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 isstring= [
<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).........................
IFDebugSN="S"THEN
Info("/mnt/sdcard/TaxiFv/Arquivos/EnvioWSVersao.TXT",Xml_SEND)//Celular/tablet
IFInAndroidMode() =True
IFInSimulatorMode() =FalseTHEN// 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","","")

IFok=True//deu certo THEN

XML_Retorno=WS_Android_IOS_HTTPGetResult()

//
ok=False

//DEBUG - Arquivo Texto para Debug do que veio do servidor
IFDebugSN="S"
Info("/mnt/sdcard/TaxiFv/Arquivos/RetornoWSVersaoSemTratamento.TXT",XML_Retorno)//celular ou tablet
IFInAndroidMode() =True
IFInSimulatorMode() =FalseTHEN
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

IFLength(XML_Retorno) >0THEN

ArrayDeleteAll(arr_TaxisLogados)// limpa array

IFIniOSMode() =TrueTHEN
/////////////////////////////////////////////////////////////

NoXml isstring
i isint=1

LOOP

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

IFNoXml=""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

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

END//loop

ELSE IFInAndroidMode() =True
/////////////////////////////////////////////////////////////

nInicial isint
nFinal isint
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
IFDebugSN="S"THEN
Info(XML_Retorno)// na tela
IFInAndroidMode() =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 isXMLDocument

//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 isxmlNode

//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/
IFNoXml.NumUnidad<>NullANDNoXml.ValLatitu<>NullANDNoXml.ValLongit<>NullTHEN

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
IFDebugSN="S"THEN
Info("Qtde de Taxis Disponiveis:",nContador)
END

RESULT(ok)
>
Membre enregistré
3 655 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/>