Clipper On Line • Ver Tópico - Consumo de Webservice com Harbour.

Consumo de Webservice com Harbour.

Projeto Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

 

Consumo de Webservice com Harbour.

Mensagempor Mario Mesquita » 24 Abr 2017 09:26

Bom dia e boa semana a todos.

Amigos, estou precisando aprender como fazer as operações de receber e enviar dados por meio de webservice. Vi em alguns tópicos algo sobre, mas alguns tópicos já são um pouco antigos, então gostaria de saber:

O Harbour trata as operações webservice nativamente? Ou precisa de algo externo para essas operações?

Alguma literatura disponível ou algum exemplo de uma coisa básica para o aprendizado necessário?

Conheço apenas o conceito, mas nunca lidei com isso, então quem tiver alguma dica e/ou já fez algo e puder compartilhar, agradeço.

Abraço a todos,
Mario.
Avatar de usuário

Mario Mesquita
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 557
Data de registro: 08 Dez 2009 12:47
Cidade/Estado: Rio de Janeiro
Curtiu: 73 vezes
Mens.Curtidas: 13 vezes

Consumo de Webservice com Harbour.

Mensagempor marsp » 24 Abr 2017 13:33

Também tenho interesse neste assunto.
marsp
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 43
Data de registro: 11 Fev 2013 13:09
Curtiu: 2 vezes
Mens.Curtidas: 3 vezes

Consumo de Webservice com Harbour.

Mensagempor JoséQuintas » 24 Abr 2017 16:09

No fórum tem muito exemplo, só pesquisar webservice, soap, curl, libcurl, msxml, hbtip, etc.
Nota: Isso continua igual há mais de uma década.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Consumo de Webservice com Harbour.

Mensagempor marsp » 26 Abr 2017 14:10

JoséQuintas, estou precisando emitir NFSe para Sorocaba,
já li varios post seu e do Rochinha e nãp consegui resolver o problema.
Não sei mais o que fazer. Se possível poderia dar uma olhada nos anexos e me dizer onde estou errando.

Obrigado

/************************************************
* Compilar: hbmk2 soap.prg -lhbwin -lxhb
************************************************/
#include "hbcompat.ch"
#include "hbxml.ch"
#include "hbmxml.ch"
   #Include "Common.ch"  // fwh\include
   #Include "winapi.ch"  // fwh\include
   #Include "objects.ch" // fwh\include

function main()
   local cXml, cSoapAction, cWebservice, cRetorno  , oXML
   local wIM,wSerie,wNrRPS,wDTEmi,wTrib,wSitRPS,wTPReco,wCodAti,wCpfCgc,vHash,wVSERV,wVDed
   LOCAL cXMLRetorno

   cls
   cWebservice := "https://issdigital.sorocaba.sp.gov.br/WsNFe2/LoteRps.jws?wsdl"
   cSoapAction := "enviar"
   wIM    := "00000112695"
   wSerie := "NF   "
   wNrRPS := "000000000001"
   wDTEmi := "20170418"
   wTrib  := "T "
   wSitRPS:= "N"
   wTPReco:= "N"                 // TIPO DE RECOLHIMENTO SE FOR A PREENCHE COM N SENAO S
   wVSERV := "000000000082000"
   wVDed  := "000000000000000"
   wCodAti:= "0829979901"
   wCpfCgc:= "49544406000124"    // CGC/CPF do Tomador

   vHash := hb_SHA1(wIM+wSerie+wNrRPS+wDTEmi+wTrib+wSitRPS+wTPReco+wVSERV+wVDed+wCodAti+wCpfCgc)

   cXML:=[<?xml version="1.0" encoding="UTF-8"?>]+;
   [<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">]+;
      "<soapenv:Body>"+;
          "<soapenv:enviar>"+;
               [<ns1:ReqEnvioLoteRPS xmlns:ns1="http://localhost:8080/WsNFe2/lote" xmlns:tipos="http://localhost:8080/WsNFe2/tp" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://localhost:8080/WsNFe2/lote http://localhost:8080/WsNFe2/xsd/ReqEnvioLoteRPS.xsd">]+;
         "<Cabecalho>"+;
            "<CodCidade>7145</CodCidade>"+;
            "<CPFCNPJRemetente>03531116000145</CPFCNPJRemetente>"+;
            "<RazaoSocialRemetente>EMPRESA MODELO</RazaoSocialRemetente>"+;
            "<transacao/>"+;
            "<dtInicio>2017-04-19</dtInicio>"+;
            "<dtFim>2017-04-19</dtFim>"+;
            "<QtdRPS>1</QtdRPS>"+;
            "<ValorTotalServicos>820.00</ValorTotalServicos>"+;
            "<ValorTotalDeducoes>0.00</ValorTotalDeducoes>"+;
            "<Versao>1</Versao>"+;
            "<MetodoEnvio>ws</MetodoEnvio>"+;
         "</Cabecalho>"+;
         [<Lote Id="lote:1ABCDZ">]+;
            [<RPS Id="rps:1">]+;
               "<Assinatura>"+vHash+"</Assinatura>"+;
               "<InscricaoMunicipalPrestador>000112695</InscricaoMunicipalPrestador>"+;
               "<RazaoSocialPrestador>EMPRESA MODELO</RazaoSocialPrestador>"+;
               "<TipoRPS>RPS</TipoRPS>"+;
               "<SerieRPS>NF</SerieRPS>"+;
               "<NumeroRPS>1</NumeroRPS>"+;
               "<DataEmissaoRPS>2017-04-19T15:00:00</DataEmissaoRPS>"+;
               "<SituacaoRPS>N</SituacaoRPS>"+;
               "<SerieRPSSubstituido/>"+;
               "<NumeroRPSSubstituido>0</NumeroRPSSubstituido>"+;
               "<NumeroNFSeSubstituida>0</NumeroNFSeSubstituida>"+;
               "<DataEmissaoNFSeSubstituida>1900-01-01</DataEmissaoNFSeSubstituida>"+;
               "<SeriePrestacao>99</SeriePrestacao>"+;
               "<InscricaoMunicipalTomador>0000000</InscricaoMunicipalTomador>"+;
               "<CPFCNPJTomador>49544406000124</CPFCNPJTomador>"+;
               "<RazaoSocialTomador>EMPRESA DE TESTES</RazaoSocialTomador>"+;
               "<DocTomadorEstrangeiro/>"+;
               "<TipoLogradouroTomador>Rua</TipoLogradouroTomador>"+;
               "<LogradouroTomador>SANTA RITA</LogradouroTomador>"+;
               "<NumeroEnderecoTomador>425</NumeroEnderecoTomador>"+;
               "<ComplementoEnderecoTomador/>"+;
               "<TipoBairroTomador>Bairro</TipoBairroTomador>"+;
               "<BairroTomador>Eden</BairroTomador>"+;
               "<CidadeTomador>0007145</CidadeTomador>"+;
               "<CidadeTomadorDescricao>Sorocaba</CidadeTomadorDescricao>"+;
               "<CEPTomador>18087157</CEPTomador>"+;
               "<EmailTomador>rafael@ig.com.br</EmailTomador>"+;
               "<CodigoAtividade>829979901</CodigoAtividade>"+;
               "<AliquotaAtividade>5.0000</AliquotaAtividade>"+;
               "<TipoRecolhimento>A</TipoRecolhimento>"+;
               "<MunicipioPrestacao>0007145</MunicipioPrestacao>"+;
               "<MunicipioPrestacaoDescricao>Sorocaba</MunicipioPrestacaoDescricao>"+;
               "<Operacao>A</Operacao>"+;
               "<Tributacao>T</Tributacao>"+;
               "<ValorPIS>5.33</ValorPIS>"+;
               "<ValorCOFINS>24.60</ValorCOFINS>"+;
               "<ValorINSS>0.00</ValorINSS>"+;
               "<ValorIR>12.30</ValorIR>"+;
               "<ValorCSLL>8.20</ValorCSLL>"+;
               "<AliquotaPIS>0.6500</AliquotaPIS>"+;
               "<AliquotaCOFINS>3.0000</AliquotaCOFINS>"+;
               "<AliquotaINSS>11.0000</AliquotaINSS>"+;
               "<AliquotaIR>1.5000</AliquotaIR>"+;
               "<AliquotaCSLL>1.0000</AliquotaCSLL>"+;
               "<DescricaoRPS>Servico de processamento de dados</DescricaoRPS>"+;
               "<DDDPrestador>011</DDDPrestador>"+;
               "<TelefonePrestador>12345678</TelefonePrestador>"+;
               "<DDDTomador>011</DDDTomador>"+;
               "<TelefoneTomador>12345678</TelefoneTomador>"+;
               "<MotCancelamento/>"+;
               "<CPFCNPJIntermediario/>"+;
               "<Deducoes/>"+;
               "<Itens>"+;
                  "<Item>"+;
                     "<DiscriminacaoServico>Sistema de gestao</DiscriminacaoServico>"+;
                     "<Quantidade>1.0000</Quantidade>"+;
                     "<ValorUnitario>820.0000</ValorUnitario>"+;
                     "<ValorTotal>820.00</ValorTotal>"+;
                     "<Tributavel>S</Tributavel>"+;
                  "</Item>"+;
               "</Itens>"+;
            "</RPS>"+;
         "</Lote>"+;
         "</ns1:ReqEnvioLoteRPS>"+;
    "</soapenv:enviar>"+;
  "</soapenv:Body>"+;
"</soapenv:Envelope>"

   *-- VERIFICA A ESTRUTURA DO XML SE ESTÁ CORRETA
   oXML := TXMLDocument():New( cXml, HBXML_STYLE_NOESCAPE )

   IF oXML:nError != HBXML_ERROR_NONE
      alert( "xml com problema " + Str( oXML:nError ) )
      RETURN
   ENDIF

   *-- ENVIA O WEBSERVICE E LE O RETORNO
   cRetorno := MicrosoftXmlSoapPost( cXml, cSoapAction, cWebservice )

   *--
   MemoWrit('retorno.xml',cRetorno)

RETURN

*------------------------------------------------------
*------------------------------------------------------
FUNCTION MicrosoftXmlSoapPost( cXmlSoap, cSoapAction, cWebService )
LOCAL oServer, oDOMDoc, nCont, cRetorno := "*ERRO*", cXmlRetorno := ""
   oServer:=CreateObject( "MSXML2.ServerXMLHTTP.5.0")
   oServer:Open( "POST", cWebService, .F. )
   oServer:SetRequestHeader( "SOAPAction", cSoapAction )
// oServer:SetRequestHeader( "Content-Type", "text/xml; charset=utf-8" )

   oDOMDoc:=CreateObject( "MSXML2.DOMDocument.5.0" )
   oDOMDoc:async              := .F.
   oDOMDoc:validateOnParse    := .T.
   oDOMDoc:resolveExternals   := .F.
   oDOMDoc:preserveWhiteSpace := .T.
   oDOMDoc:LoadXML(cXmlSoap)
   IF oDOMDoc:parseError:errorCode <> 0
      msginfo("Erro: xML nao carregado")
      RETURN Nil
   ENDIF
   TRY
      oServer:send(oDOMDoc:xml)
   CATCH oError
      msginfo("Falha no envio do xML")
      RETURN Nil
   END
   DO WHILE oServer:readyState <> 4
      syswait(0.5)
   ENDDO
   cRetorno := oServer:responseText
   IF ValType( cRetorno ) == "C"
      cXmlRetorno := cRetorno
   ELSEIF cRetorno == NIL
      cXmlRetorno := "*ERRO*"
   ELSE
      cXmlRetorno := ""
      FOR nCont = 1 TO Len( cRetorno )
        cXmlRetorno += Chr( cRetorno[ nCont ] )
      NEXT
   ENDIF
RETURN( cXmlRetorno )

Anexos
Arq_Retorno.xml
(694 Bytes) Baixado 246 vezes
Arq_ENVIO.xml
(4.74 KiB) Baixado 274 vezes
marsp
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 43
Data de registro: 11 Fev 2013 13:09
Curtiu: 2 vezes
Mens.Curtidas: 3 vezes

Consumo de Webservice com Harbour.

Mensagempor JoséQuintas » 26 Abr 2017 14:42

A comunicação, à primeira vista, funcionou, já que tem resposta.
O problema agora é com o XML.

Esse XML já contém o envelope, usado pra comunicação, e o XML da nota propriamente dito.

Esse XML é "duplo" contém o envelope de comunicação e a nota de serviço.

É nesse envelope que vão as configurações necessárias pra comunicação, e isso pode alterar muito de um webservice pra outro.

Imagine como sendo a chamada de uma função em um programa, contendo parâmetros.
Quais são os parâmetros? Depende de como o programador criou essa função.

Por isso acaba sendo complicado, porque o conteúdo tem que ser exato, inclusive maiúsculas/minúsculas.

Pelo retorno, parece que chegou num parâmetro que não deveria ser, pode estar faltando ou sobrando alguma coisa.

<faultstring>org.xml.sax.SAXException:SimpleDEserializer encountered a child element, which is NOT expected, in something it was trying to deserialize.</faultstring>

<tagpai>
<tagfilho>deddd</tagfilho>
</tagpai>

É só o que dá pra dizer.

Mais que isso, só olhando manual da nota, manual do webservice, etc. mas aí deixa de ser ajuda, e entra em desenvolver algo exclusivo de seu uso.

O que estou estranhando são esses endereços locais, localhost:8080, mas acredito que seja local no servidor, ao receber o arquivo.

José M. C. Quintas
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Consumo de Webservice com Harbour.

Mensagempor JoséQuintas » 26 Abr 2017 14:59

Por acaso olhou esta parte?

sorocaba.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Consumo de Webservice com Harbour.

Mensagempor marsp » 26 Abr 2017 15:08

JoséQuintas,

Muito obrigado pela atenção.
O envio por lotes não esta mais sendo usado pela prefeitura de Sorocaba.
marsp
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 43
Data de registro: 11 Fev 2013 13:09
Curtiu: 2 vezes
Mens.Curtidas: 3 vezes

Consumo de Webservice com Harbour.

Mensagempor JoséQuintas » 26 Abr 2017 15:55

Vixe....
O manual deles está errado..... kkkkk

Por isso é difícil ajudar nessas coisas e acaba o interessado tendo que ir atrás.
Pode ser qualquer coisa....
Nesse caso, com tudo certo, tá errado.... kkkkk

Se imaginar que cada município é de um jeito, e cada prefeito pode alterar tudo, piorou....
É phoda... com PH maiúsculo...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Consumo de Webservice com Harbour.

Mensagempor André Corrêa » 12 Mai 2017 08:50

Bom dia,

Ainda sobre webservice SOAP com Harbour, existe alguma alternativa nativa a MSXML2 e MSSOAP?
Andei pesquisando bastante e não consegui encontrar nenhum exemplo que não use essas dlls.
Preciso enviar um XML para um webservice, mas não posso utilizar nenhuma dll externa.
Tenho o endereço do WSDL, monto o XML a ser enviado, mas não sei como fazer o envio, pois os
exemplos dos manuais estão em .NET e depois de clonar o WSDL é gerada uma classe com todos os
métodos, mas o Harbour não tem essa opção (ou eu não conheço).
Existe alguma lib que não dependa de dll ou funções nativas, que possa usar para fazer a comunicação,
montar o header HTTP, envelopar o conteúdo, fazer o envio e capturar o retorno?

Obrigado,
-- André Corrêa

"Opte por aquilo que faz o seu coração vibrar, apesar de todas as consequências". - Osho
Avatar de usuário

André Corrêa
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 81
Data de registro: 03 Nov 2015 06:46
Cidade/Estado: Caraguatatuba/SP
Curtiu: 8 vezes
Mens.Curtidas: 3 vezes

Consumo de Webservice com Harbour.

Mensagempor JoséQuintas » 12 Mai 2017 10:15

Existe alguma lib que não dependa de dll ou funções nativas, que possa usar para fazer a comunicação,


Se não depender de DLL nem de função nativa, vai ser como? Outra linguagem de programação?
Ou é uma coisa ou é outra.

depois de clonar o WSDL é gerada uma classe com todos os
métodos, mas o Harbour não tem essa opção (ou eu não conheço).


Sim, são criadas funções pra serem usadas no NET.
Harbour não é NET, e não tem as bibliotecas do NET.

Ainda sobre webservice SOAP com Harbour, existe alguma alternativa nativa a MSXML2 e MSSOAP?


Apesar de dizerem ser nativa, não é. Seria o uso da LIBCURL, através da DLL dela, junto com OPENSSL.
Pra mim trata-se apenas de trocar uma DLL por outra.

Seria bom se existisse isso mais automático, mas não existe.
Também não existe um padrão fixo, sempre existem diferenças pequenas ou grandes.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Consumo de Webservice com Harbour.

Mensagempor André Corrêa » 12 Mai 2017 10:39

Quintas,

Obrigado pelo retorno.

Existe alguma lib que não dependa de dll ou funções nativas, que possa usar para fazer a comunicação?


Me expressei mal no trecho acima.
O que quis dizer é "Existe alguma lib ou função nativa, que não dependa de dll?"

Sim, são criadas funções pra serem usadas no NET.
Harbour não é NET, e não tem as bibliotecas do NET.


Eu sei que Harbour não faz parte da plataforma .NET, mas como é algo bastante usado, achei que pudesse existir uma opção mais
simples, da qual eu apenas não tivesse conhecimento. Delphi também não é .NET e tem essa opção de importar o WSDL.

Seria bom se existisse isso mais automático, mas não existe.


Seria incrível se existisse. Eu não tenho o conhecimento necessário para fazê-lo, mas acho estranho que até o momento não
tenha sido criado por alguém.

Então, resumidamente, a forma mais simples ou direta seria usar a MSXML2 mesmo?

Obrigado,
-- André Corrêa

"Opte por aquilo que faz o seu coração vibrar, apesar de todas as consequências". - Osho
Avatar de usuário

André Corrêa
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 81
Data de registro: 03 Nov 2015 06:46
Cidade/Estado: Caraguatatuba/SP
Curtiu: 8 vezes
Mens.Curtidas: 3 vezes

Consumo de Webservice com Harbour.

Mensagempor André Corrêa » 14 Mai 2017 17:33

Boa tarde pessoal,

Alguém poderia me dar uma ajuda?

Eu estou testando a comunicação com um webservice, mas tenho algumas dúvidas
sobre como montar o envelope SOAP.
Na documentação que recebi consta apenas a chamada ao método que faz o envio,
em C#. Como o Harbour não tem a opção de importar o WSDL para gerar a classe e
chamar o método, tentei montar o envelope e enviar o XML seguindo alguns exemplos
que encontrei aqui no fórum, mas nenhum funcionou.

O WSDL é:
http://webservice.conciliadora.com.br/WSConciliadoraCliente/WSCACliente.svc?singleWsdl.

O exemplo em C# é:

      var vendaFile = File.OpenRead(txeArquivo.Text); 
      string Mensagem;
      ErroArquivo[] Lista = null;
      If (callWebService.WSEnviaArquivoVendaCliente(
                            Estabelecimento: txeRetConcEstabelecimento.Text,
                            Senha: txeRetConcSenha.Text,
                            FileName: Path.GetFileName(txeArquivo.Text),
                            Length: vendaFile.Length,
                            FileByteStream: vendaFile, 
                            Mensagem: out Mensagem, 
                            XMLErros: out Lista
                            ) == 0)
     {
         //OK
     }
     else
     {
         //ERRO
     }


O código que estou testando é:

FUNCTION EnviarXml()
   LOCAL cXml, cSoapAction, cWebservice, cOperation, cRetorno, cxlido
   LOCAL oXML

   cWebservice := "http://webservice.conciliadora.com.br/WSConciliadoraCliente/WSCACliente.svc?singleWsdl"
   cSoapAction := "http://tempuri.org/IWSCACliente/WSEnviaArquivoVendaCliente"
   cOperation  := "WSEnviaArquivoVendaCliente"
   *-
*   cxlido:=HB_Memoread('C:\A\LXA13703.xml')
   *--
   cXml :='             <tns:Estabelecimento>132332943</tns:Estabelecimento>'+hb_eol()+;
          '             <tns:FileName>C:\A\LXA13703.xml</tns:FileName>'+hb_eol()+;
          '             <tns:Length>2.444</tns:Length>'+hb_eol()+;
          '             <tns:Senha>625337</tns:Senha>'+hb_eol()

   cXml := SoapEnvelope( cXml, cOperation ) //
   *--
   MsgAlert(cXml)

   oXML := TXMLDocument():New( cXml, HBXML_STYLE_NOESCAPE )

   IF oXML:nError != HBXML_ERROR_NONE
      MsgAlert( "xml com problema " + Str( oXML:nError ) )
   ENDIF

   *--
   cRetorno := MicrosoftXmlSoapPost( cXml, cSoapAction, cWebservice )
   *--
   HB_MemoWrit('C:\A\retorno.xml',cRetorno)
   MsgAlert(cRetorno)

RETURN Nil

*------------------------------------------------------
*------------------------------------------------------
FUNCTION MicrosoftXmlSoapPost( cXmlSoap, cSoapAction, cWebService )
   LOCAL oServer, oDOMDoc, oError
   LOCAL nCont
   LOCAL cRetorno := "*ERRO*", cXmlRetorno := ""

   oServer := CreateObject( "MSXML2.ServerXMLHTTP.5.0")
   oServer:Open( "POST", cWebService, .F. )
   oServer:SetRequestHeader( "SOAPAction", cSoapAction )
   oServer:SetRequestHeader( "Content-Type", "text/xml; charset=utf-8" )

   oDOMDoc = CREATEOBJECT("MSXML2.DOMDocument.5.0")

   oDOMDoc:async = .F.
   oDOMDoc:validateOnParse  = .T.
   oDOMDoc:resolveExternals := .F.
   oDOMDoc:preserveWhiteSpace = .T.
   oDOMDoc:LoadXML(cXmlSoap)
   IF oDOMDoc:parseError:errorCode <> 0
     MsgAlert('Erro: xML nao carregado')
     RETURN Nil
   ENDIF
   TRY
     oServer:send(oDOMDoc:xml)
   CATCH oError
     MsgAlert('Falha no envio do xML')
     RETURN Nil
   END
   DO WHILE oServer:readyState <> 4
     HB_milliseconds(500)
   ENDDO
   cRetorno := oServer:responseText

   IF ValType( cRetorno ) == "C"
      cXmlRetorno := cRetorno
   ELSEIF cRetorno == NIL
      cXmlRetorno := "*ERRO*"
   ELSE
      cXmlRetorno := ""
      FOR nCont = 1 TO Len( cRetorno )
        cXmlRetorno += Chr( cRetorno[ nCont ] )
      NEXT
   ENDIF
RETURN cXmlRetorno

*----------------------------------------------
*----------------------------------------------
FUNCTION SoapEnvelope( cXml, cOperation )
   LOCAL cXmlEnvelope, cxlido

   cXmlEnvelope:= '<?xml version="1.0" encoding="utf-8"?>'+hb_eol()+;
                  '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="http://tempuri.org/">'+hb_eol()+;
                  '   <soapenv:Header>'+hb_eol()+;
                  '      <tns:'+cOperation+'>'+hb_eol()+;
                  '          <tns:RemoteFileInfo>'+hb_eol()
   cXmlEnvelope+=                cXml
   cXmlEnvelope+= '          </tns:RemoteFileInfo>'+hb_eol()+;
                  '      </tns:'+cOperation+'>'+hb_eol()+;
                  '   </soapenv:Header>'+hb_eol()+;
                  '   <soapenv:Body/>'+hb_eol()+;
                  '</soapenv:Envelope>'+hb_eol()

   HB_MemoWrit('C:\A\vai.xml',cXmlEnvelope)
RETURN cXmlEnvelope

*--------------------------------
*--------------------------------
FUNCTION XmlTag( cNome, cConteudo )
   IF Empty( cConteudo )
      RETURN "<" + cNome + " />"
   ENDIF
RETURN "<" + cNome + ">" + cConteudo + "</" + cNome + ">"


O retorno é "Estabelecimento não informado".

Alguém sabe dizer se tem como gerar o SOAP header e saber exatamente onde informar o
XML com os dados, apenas lendo a descrição contida no WSDL?
Alguém poderia me ajudar a montar o envelope SOAP e anexar o XML com os dados, por favor?

Obrigado,
-- André Corrêa

"Opte por aquilo que faz o seu coração vibrar, apesar de todas as consequências". - Osho
Avatar de usuário

André Corrêa
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 81
Data de registro: 03 Nov 2015 06:46
Cidade/Estado: Caraguatatuba/SP
Curtiu: 8 vezes
Mens.Curtidas: 3 vezes

Consumo de Webservice com Harbour.

Mensagempor Jairo Maia » 14 Mai 2017 19:11

Olá André,

Sem entrar nas outras questões, primeiro você precisa criar o XML, que não está sendo criado. O que você você está criando é um arquivo de texto comum. Não está envelopado (não tem as tags de início e fim), e está usando caractere não suportado, a saber o ":".

Compile e rode esses exemplos, depois dê duplo clique sobre eles e verá que serão abertos. Para ver a diferença entre eles, abra com o bloco de notas por exemplo. Aconselho a usar como no exemplo Não Formatado:

Exemplo 1 (Formatado - com quebra de linhas):
cXml := '<begin>'+hb_eol()+;
          '<tnsEstabelecimento>132332943</tnsEstabelecimento>'+hb_eol()+;
          '<tnsFileName>C:\A\LXA13703.xml</tnsFileName>'+hb_eol()+;
          '<tnsLength>2.444</tnsLength>'+hb_eol()+;
          '<tnsSenha>625337</tnsSenha>'+hb_eol()+;
        '</begin>'

Hb_MemoWrit( "xml1.xml", cxml )

Exemplo 2 (Não Formatado - sem quebra de linas):
cXml := '<begin>'+;
          '<tnsEstabelecimento>132332943</tnsEstabelecimento>'+;
          '<tnsFileName>C:\A\LXA13703.xml</tnsFileName>'+;
          '<tnsLength>2.444</tnsLength>'+;
          '<tnsSenha>625337</tnsSenha>'+;
        '</begin>'

Hb_MemoWrit( "xml2.xml", cxml )
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

Consumo de Webservice com Harbour.

Mensagempor André Corrêa » 16 Mai 2017 10:42

Bom dia Jairo,

Segue o código corrigido. Agora o XML é gerado e aberto corretamente, mas não há resposta do webservice, nem
de erro, nem de sucesso. "oServer:responseText" volta vazio, mas não "NIL".

Código usado para o envio:

FUNCTION EnviarXml()
   LOCAL cXml, cSoapAction, cWebservice, cOperation, cRetorno, cxlido
   LOCAL oXML

   cWebservice := "http://webservice.conciliadora.com.br/WSConciliadoraCliente/WSCACliente.svc?singleWsdl"
   cSoapAction := "http://tempuri.org/IWSCACliente/WSEnviaArquivoVendaCliente"
   cOperation  := "WSEnviaArquivoVendaCliente"

   cXml :='<Estabelecimento>9999999999</Estabelecimento>'+;
          '<FileName>C:\A\LXA13703.xml</FileName>'+;
          '<Length>2.444</Length>'+;
          '<Senha>159753</Senha>'

  cXml := SoapEnvelope( cXml, cOperation ) //
   *--

  oXML := TXMLDocument():New( cXml, HBXML_STYLE_NOESCAPE )

  IF oXML:nError != HBXML_ERROR_NONE
    MsgAlert( "xml com problema " + Str( oXML:nError ) )
  ENDIF

  *--
  cRetorno := MicrosoftXmlSoapPost( cXml, cSoapAction, cWebservice )
  *--
  HB_MemoWrit('C:\A\retorno.xml',cRetorno)
   
  MsgAlert(cRetorno)

RETURN Nil

*------------------------------------------------------
FUNCTION MicrosoftXmlSoapPost( cXmlSoap, cSoapAction, cWebService )
   LOCAL oServer, oDOMDoc, oError
   LOCAL nCont
   LOCAL cRetorno := "*ERRO*", cXmlRetorno := ""

   oServer := CreateObject( "MSXML2.ServerXMLHTTP")
   oServer:Open( "POST", cWebService, .F. )
   oServer:SetRequestHeader( "SOAPAction", cSoapAction )
   oServer:SetRequestHeader( "Content-Type", "text/xml; charset=utf-8" )

   oDOMDoc = CREATEOBJECT("MSXML2.DOMDocument")

   oDOMDoc:async = .F.
   oDOMDoc:validateOnParse  = .T.
   oDOMDoc:resolveExternals := .F.
   oDOMDoc:preserveWhiteSpace = .T.
   oDOMDoc:LoadXML(cXmlSoap)
   IF oDOMDoc:parseError:errorCode <> 0
     MsgAlert('Erro: xML nao carregado'+CRLF+'Erro: '+ToString(oDOMDoc:parseError:Reason)+' Posição: '+ToString(oDOMDoc:parseError:linepos))
     RETURN Nil
   ENDIF
   TRY
     oServer:send(oDOMDoc:xml)
   CATCH oError
     MsgAlert('Falha no envio do xML')
     RETURN Nil
   END
   DO WHILE oServer:readyState <> 4
     HB_milliseconds(500)
   ENDDO
   cRetorno := oServer:responseText

   IF ValType( cRetorno ) == "C"
      cXmlRetorno := cRetorno
   ELSEIF cRetorno == NIL
      cXmlRetorno := "*ERRO*"
   ELSE
      cXmlRetorno := ""
      FOR nCont = 1 TO Len( cRetorno )
        cXmlRetorno += Chr( cRetorno[ nCont ] )
      NEXT
   ENDIF
RETURN cXmlRetorno

*----------------------------------------------
*----------------------------------------------
FUNCTION SoapEnvelope( cXml, cOperation )
   LOCAL cXmlEnvelope, cxlido

   cxlido:=HB_Memoread('C:\A\LXA13703.xml')

   cXmlEnvelope:= '<?xml version="1.0" encoding="utf-8"?>'+;
                  '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">'+;
                  '<soapenv:Header>'+;
                  cXml+;
                  '</soapenv:Header>'+;
                  '<soapenv:Body>'+;
                  cxlido+;
                  '</soapenv:Body>'+;
                  '</soapenv:Envelope>'

  HB_MemoWrit('C:\A\vai.xml',cXmlEnvelope)
RETURN cXmlEnvelope

*--------------------------------
*--------------------------------
FUNCTION XmlTag( cNome, cConteudo )
   IF Empty( cConteudo )
      RETURN "<" + cNome + " />"
   ENDIF
RETURN "<" + cNome + ">" + cConteudo + "</" + cNome + ">"


XML enviado:
<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"><soapenv:Header><Estabelecimento>9999999999</Estabelecimento><FileName>C:\A\LXA13703.xml</FileName><Length>2.444</Length><Senha>159753</Senha></soapenv:Header><soapenv:Body><registros><cabecalho><Estabelecimento>999999999</Estabelecimento><DataInicial>27/01/17</DataInicial><DataFinal>27/01/17</DataFinal><Versao>3</Versao><Sistema/></cabecalho><registro><CodigoTipoProduto>10</CodigoTipoProduto><DescricaoTipoProduto>Mastercard Credito a Vista</DescricaoTipoProduto><CodigoAutorizacao>456546</CodigoAutorizacao><IdentificadorPagamento>114956</IdentificadorPagamento><DataVenda>27/01/17</DataVenda><DataVencimento>28/02/17</DataVencimento><ValorVendaParcela>200,00</ValorVendaParcela><ValorLiquidoParcela/><TotalVenda>438,00</TotalVenda><Taxa/><Parcela>0</Parcela><TotalDeParcelas>0</TotalDeParcelas><NSU/><TID/><MeioCaptura>1</MeioCaptura><Operadora>2</Operadora><Modalidade>1</Modalidade></registro><registro><CodigoTipoProduto>11</CodigoTipoProduto><DescricaoTipoProduto>Mastercard Maestro Debito</DescricaoTipoProduto><CodigoAutorizacao>456151</CodigoAutorizacao><IdentificadorPagamento>114956</IdentificadorPagamento><DataVenda>27/01/17</DataVenda><DataVencimento>28/01/17</DataVencimento><ValorVendaParcela>238,00</ValorVendaParcela><ValorLiquidoParcela/><TotalVenda>438,00</TotalVenda><Taxa/><Parcela>0</Parcela><TotalDeParcelas>0</TotalDeParcelas><NSU/><TID/><MeioCaptura>1</MeioCaptura><Operadora>2</Operadora><Modalidade>0</Modalidade></registro><registro><CodigoTipoProduto>10</CodigoTipoProduto><DescricaoTipoProduto>Mastercard Credito a Vista</DescricaoTipoProduto><CodigoAutorizacao>549137</CodigoAutorizacao><IdentificadorPagamento>114960</IdentificadorPagamento><DataVenda>27/01/17</DataVenda><DataVencimento>28/02/17</DataVencimento><ValorVendaParcela>200,00</ValorVendaParcela><ValorLiquidoParcela/><TotalVenda>438,00</TotalVenda><Taxa/><Parcela>0</Parcela><TotalDeParcelas>0</TotalDeParcelas><NSU/><TID/><MeioCaptura>1</MeioCaptura><Operadora>2</Operadora><Modalidade>1</Modalidade></registro><registro><CodigoTipoProduto>11</CodigoTipoProduto><DescricaoTipoProduto>Mastercard Maestro Debito</DescricaoTipoProduto><CodigoAutorizacao>698410</CodigoAutorizacao><IdentificadorPagamento>114960</IdentificadorPagamento><DataVenda>27/01/17</DataVenda><DataVencimento>28/01/17</DataVencimento><ValorVendaParcela>238,00</ValorVendaParcela><ValorLiquidoParcela/><TotalVenda>438,00</TotalVenda><Taxa/><Parcela>0</Parcela><TotalDeParcelas>0</TotalDeParcelas><NSU/><TID/><MeioCaptura>1</MeioCaptura><Operadora>2</Operadora><Modalidade>0</Modalidade></registro></registros></soapenv:Body></soapenv:Envelope>


Obrigado,
-- André Corrêa

"Opte por aquilo que faz o seu coração vibrar, apesar de todas as consequências". - Osho
Avatar de usuário

André Corrêa
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 81
Data de registro: 03 Nov 2015 06:46
Cidade/Estado: Caraguatatuba/SP
Curtiu: 8 vezes
Mens.Curtidas: 3 vezes

Consumo de Webservice com Harbour.

Mensagempor Jairo Maia » 16 Mai 2017 13:39

Boa tarde André,

Infelizmente falei do XM porque vi que estava com problemas, mas não sei dizer nada sobre o método SOAP. Vamos aguardar algum colega que possa ajudar nisso.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

Próximo



Retornar para Harbour

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 12 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro