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,