Página 1 de 4
Consumir Webservice ( SOAP )
Enviado: 10 Jan 2014 19:37
por MSDN
Preciso fazer uma implementação, busquei informações sobre o que é :
WebService
A comunicação SOAP é basicamente simples: é enviado o XML SOAP para um determinado endereço, e é recebido um XML de resposta.
O webservice pode ou não exigir um certificado.
Também pode ser necessário informar a SOAP Action, que é a ação a ser tomada pelo webservice.
Para comunicação SOAP pode ser usado o MSXML, que é uma biblioteca fornecida pela Microsoft.
Informações sobre o XML do documento, e o XML do lote podem ser obtidas no manual do contribuinte.
Os schemmas fornecidos pela Fazenda também ajudam, caso tenha um interpretador de schemas.
Informações sobre o XML do SOAP
Ao acessar uma página de webservice, pelo navegador, o próprio webservice fornece exemplos de XML SOAP.
Por esse meio também pode ser obtido o nome da Soap Action
Porém, pesquisando pela internet e aqui no fórum inclusive, não vi nada claro o suficiente para entender quais arquivos de cabeçalho (ch) e libs são necessários para fazer a comunicação usando Harbour ou xHarbour. Infelizmente a documentação é muito pobre nesse sentido, o que faz os programadores perderem muito tempo em tentativa e erro, pois vemos códigos em outras linguagens, como Java e C#, e não conseguimos achar classes, funções e comandos equivalentes, e quando aparece um fragmento de código fonte usando uma classe, não temos a documentação dela.
Qualquer ajuda é bem vinda.
Obrigado
Consumir Webservice ( SOAP )
Enviado: 12 Jan 2014 01:54
por rochinha
Amiguinho,
O seguinte trecho abaixo foi extraido de um código maior, mas ele exemplifica quais objeto são acionados para compor a comunicação:
Código: Selecionar todos
cWebService := "http://webservices.sefaz.rs.gov.br/CadastroContribuintesRSGeral_XML.asp"
txtCPF := "00000000000"
txtSenha := "123456"
txtIE := "0000000000"
txtCNPJ := "00000000000000"
txtCPFtitular := "00000000000"
// Monta o documento XML conforme a estrutura definida para este Web Service
sConteudo := []
sConteudo := sConteudo + [<PARAMETROS>]
sConteudo := sConteudo + [ <CPF>] + Right("00000000000" & Trim(txtCPF), 11) + [</CPF>]
sConteudo := sConteudo + [ <SENHA>] + txtSenha + [</SENHA>]
sConteudo := sConteudo + [ <IE>] + Right("0000000000" + Trim(txtIE), 10) + [</IE>]
sConteudo := sConteudo + [ <CNPJ>] + Right("00000000000000" + Trim(txtCNPJ), 14) + [</CNPJ>]
sConteudo := sConteudo + [ <CPFTITULAR>] + Right("00000000000" + Trim(txtCPFtitular), 11) + [</CPFTITULAR>]
sConteudo := sConteudo + [</PARAMETROS>]
// Ativa objeto DOM
objXMLDOM := TOLEAUTO():New( "Microsoft.XMLDOM" )
// Converte para um documento XML no padrão DOM
objXMLDOM:async := .f.
objXMLDOM:loadXML( sConteudo )
objXMLHTTP := TOleAuto():New( "MSXML2.ServerXMLHTTP" )
// Aponta para o Web Service
objXMLHTTP:open( "POST", cWebService, .F. )
// Envia o documento XML para o Web Service
objXMLHTTP:send( objXMLDOM:xml )
// Aqui é carregado o retorno do Web Service.
sRetorno := objXMLHTTP:responseXML:xml
objXMLDOM:async := .f.
cResponseText := objXMLDOM:loadXML( sRetorno )
// Apresenta a resposta
MemoEdit( cResponseText )
No meu caso uso Harbour tradicional versão 0.45 e a biblioteca que é usada é a
HBOLE.LIB. No caso acima, por se tratar de uma aplicação usando Fivewin 4 Harbour, aciono os objetos do S.O. usando a classe TOLEAuto() mas é possivel fazer o mesmo com
win_OleCreate ou
CreateObject.
Consumir Webservice ( SOAP )
Enviado: 15 Ago 2014 17:45
por Ramos
Voce diz:
Rochinha escreveu:No meu caso uso Harbour tradicional versão 0.45 e a biblioteca que é usada é a HBOLE.LIB. No caso acima, por se tratar de uma aplicação usando Fivewin 4 Harbour, aciono os objetos do S.O. usando a classe TOLEAuto() mas é possivel fazer o mesmo com win_OleCreate ou CreateObject.
Entendi o exemplo, mas para clipper puro tem alguma outra forma de fazer ? Porque ler CreateObject.
Consumir Webservice ( SOAP )
Enviado: 15 Ago 2014 20:02
por rochinha
Amiguinho,
Em Clipper puro voce poderá:
- criar o .XML e salva-lo como se estivesse salvando um arquivo .TXT, Usando um simples MemoWrit()
- enviar o arquivo, acionando o IExplore.exe via commandline, com start iexplorer http://...
Mas o problema reside em obter a resposta.
Agora veja bem:
Voce postou uma duvida solicitando ajuda na sessão Harbour, então, as respostas se darão em/para Harbour.
Para solucionar sua duvida em Clipper, poste sua duvida na sessão Clipper. Pois para Harbour fica mais fácil trabalhar estes resultados.
Consumir Webservice ( SOAP )
Enviado: 16 Ago 2014 13:28
por Ramos
Me desculpe, obrigado.
Estou tentando fazer um programa externo em Harbour, para chamá-lo pelo sistema, mas sou cru de tudo nisso. Estou tentando usar o exemplo acima, a resposta está em branco, mas vou tentar aqui. Vou tentar usar SOAP. Obrigado pela ajuda.
Consumir Webservice ( SOAP )
Enviado: 17 Ago 2014 00:35
por rochinha
Amiguinho,
Ai sim, desta forma você poderá criar uma espécie de serviço, apesar de que para ser um serviço o mesmo deveria possuir alguns recursos comandados pelo windows via serviços.
Veja minha resposta no tópico
Re: Consumir Web Services com o xHarbour.
Nele exemplifico a criação de um .XML, envio para um WerService e captura do retorno.
Analise e veja o que voce pode tirar disto.
Consumir Webservice ( SOAP )
Enviado: 23 Ago 2014 16:22
por Alexandre Silva
Entao senhores..
Esse é meu calcanhar de aquiles..
Vi e testei esses 2 exemplos, mas nao obtive sucesso..
O que preciso é mandar um xml e pegar o retorno, aparentemente simples..
Adaptei os dois prg em anexo
*Nao consegui colocar aqui com o CODE
Ambos retornaram NIL
eu sei que nao tem o login correto ai..
mas eu só quero é ver o xml de retorno
http://generali.averbweb.net.br/documentacao
Consumir Webservice ( SOAP )
Enviado: 25 Ago 2014 23:34
por rochinha
Amiguinho,
Fiz algumas correções e formatei o código para que voce entenda com e quando usar cada motor.
Voce só deve acionar o Microsoft.XMLDOM se for manipular um arquivo .XML, ou seja, incluir nós, tags, valores e obter trechos e valores.
O Microsoft.ServerXMLHTTP serve para a comunicação básica de arquivos texto, XML, etc.
Código: Selecionar todos
*--
* para compilar hbmk2 web -lxhb -lhbwin -lhbct -lhbwin -lhbtip -es2 -b
*---
function main()
local cResponseText, objXMLHTTP
local sconteudo := ''
cWebService := "http://generali.averbweb.net.br/Webservice/soapserver"
sconteudo := faz_xml()
objXMLHTTP := TOleAuto():New( "MSXML2.ServerXMLHTTP" )
// Aponta para o Web Service
objXMLHTTP:open( "POST", cWebService, .F. )
// Envia o documento XML para o Web Service
objXMLHTTP:send( sconteudo )
// Aqui e carregado o retorno do Web Service.
cResponseText := objXMLHTTP:responseText // XML:xml
// Apresenta a resposta
MemoEdit( cResponseText )
// Ativa objeto DOM
oXMLDoc := TOLEAUTO():New("Microsoft.XMLDOM")
root := oXMLDoc:documentElement
// Habilita leitura completa do documento
oXMLDoc:async := .f.
// Verifica o sucesso restorno
lSuccess := oXMLDoc:loadXML( cResponseText )
?oXMLDoc:XML
RespText := ""
If lSuccess
// Primeira forma de pegar um conteudo
cResposta := oXMLDoc:getElementsByTagName( "login" ):Item(0):Text
? cResposta
// Segunda forma de pegar um conteudo
FaulStringDetails := oXMLDoc:selectNodes("//login")
cResposta := FaulStringDetails:Item(0):Text
? cResposta
// Trecho para ler o conteudo de um no com varias
//x := oXMLDoc:getElementsByTagName( "sacado" )
//? oXMLDoc:getElementsByTagName( "nome" ):Item(0):Text , ;
// oXMLDoc:getElementsByTagName( "email" ):Item(0):Text
// Exemplo para ler sequencialmente um conjunto identico de nos e tags
//x := oXMLDoc:getElementsByTagName( "cobranca" )
//for i = 1 to x:length
// ? oXMLDoc:getElementsByTagName( "nome" ):Item(i-1):Text , ;
// oXMLDoc:getElementsByTagName( "email" ):Item(i-1):Text , ;
// oXMLDoc:getElementsByTagName( "status" ):Item(i-1):Text
//next
EndIf
return .t.
*--------------------
function faz_xml()
sconteudo:='<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:xmethods-delayed-quotes">'
sconteudo+=' <soapenv:Header/>'
sconteudo+=' <soapenv:Body>'
sconteudo+=' <urn:adicionarAverbacao soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">'
sconteudo+=' <args>'
sconteudo+=' <usuario>SEU_LOGIN</usuario>'
sconteudo+=' <senha>SUA_SENHA</senha>'
sconteudo+=' <emit_nome>EMITENTE</emit_nome>'
sconteudo+=' <emit_cnpj>53.561.748/0001-20</emit_cnpj>'
sconteudo+=' <emit_cidade>Cotia</emit_cidade>'
sconteudo+=' <emit_uf>SP</emit_uf>'
sconteudo+=' <tipo_documento>CTE</tipo_documento>'
sconteudo+=' <num_documento>1</num_documento>'
sconteudo+=' <serie_documento>1</serie_documento>'
sconteudo+=' <data_emissao>27/09/2013</data_emissao>'
sconteudo+=' <tipo_mercadoria>ARROZ</tipo_mercadoria>'
sconteudo+=' <tipo_embarque>RODOVIARIO</tipo_embarque>'
sconteudo+=' <valor_mercadoria>1.200,00</valor_mercadoria>'
sconteudo+=' <placa>AAA1234</placa>'
sconteudo+=' <remet_nome>EMITENTE</remet_nome>'
sconteudo+=' <remet_cnpj>53.561.748/0001-20</remet_cnpj>'
sconteudo+=' <remet_cidade>Cotia</remet_cidade>'
sconteudo+=' <remet_uf>SP</remet_uf>'
sconteudo+=' <dest_nome>EMITENTE</dest_nome>'
sconteudo+=' <dest_cnpj>53.561.748/0001-20</dest_cnpj>'
sconteudo+=' <dest_cidade>Cotia</dest_cidade>'
sconteudo+=' <dest_uf>SP</dest_uf>'
sconteudo+=' <consig_nome>CONSIGNATÁRIO</consig_nome>'
sconteudo+=' <consig_cnpj>53.561.748/0001-20</consig_cnpj>'
sconteudo+=' <consig_cidade>Cotia</consig_cidade>'
sconteudo+=' <consig_uf>SP</consig_uf>'
sconteudo+=' </args>'
sconteudo+=' </urn:adicionarAverbacao>'
sconteudo+=' </soapenv:Body>'
sconteudo+='</soapenv:Envelope>'
return sconteudo
Consumir Webservice ( SOAP )
Enviado: 26 Ago 2014 12:48
por Alexandre Silva
Obrigado, já comecou a ter retorno..
mas acontece o seguinte
1-essa lina
cResposta := oXMLDoc:getElementsByTagName( "login" ):Item(0):Text
dá erro: NO EXPORTED METHOD : TEXT
O que falta ?
2=Neste XML de retorno, o que significam esses erros ? Já coloquei o Login e usuario..
<faultcode>SOAP-ENV:Client</faultcode>
<faultstring>Bad Request</faultstring>
Código: Selecionar todos
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Client</faultcode>
<faultstring>Bad Request</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Consumir Webservice ( SOAP )
Enviado: 27 Ago 2014 08:00
por JoséQuintas
// Ativa objeto DOM
objXMLDOM := TOLEAUTO():New( "Microsoft.XMLDOM" )
// Converte para um documento XML no padrão DOM
objXMLDOM:async := .f.
objXMLDOM:loadXML( sConteudo )
...
objXMLHTTP:send( objXMLDOM:xml )
Que eu saiba não há conversão, o DOM é apenas um "testador" de XML.
Na rotina acima apenas carrega o XML no objeto, e depois pega o xml de volta.
Evita complicação se trocar isso por
Consumir Webservice ( SOAP )
Enviado: 27 Ago 2014 11:57
por Alexandre Silva
Desculpem...
Eu tirei essas duas linhas..
objXMLDOM:async := .f.
objXMLDOM:loadXML( sConteudo )
1=continuou recebendo o mesmo xml de retorno que nao sei interpretar o erro..
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Client</faultcode>
<faultstring>Bad Request</faultstring>
<SOAP-ENV:Fault>
2=e o camando
cResposta := oXMLDoc:getElementsByTagName( "login" ):Item(0):Text
dá erro: NO EXPORTED METHOD : TEXT
3= Resposta do suporte da seguradora
O xml está correto, mas eu espero receber um array em "adicionarAverbacao",
não uma string. No seu envio não há nada como 'xsi:type="xsd:string"' 
Entao como mando o array ??
Consumir Webservice ( SOAP )
Enviado: 01 Set 2014 13:12
por Alexandre Silva
Entao pessoal ...por favor me ajudem.. estou ha duas semanas ..
e nao consigo usar essa ferramenta...
será que tem outra ? ou falta algum parametro.. ?
vejam anteriormente o erro que retorna..
Consumir Webservice ( SOAP )
Enviado: 01 Set 2014 15:43
por frazato
Boa tarde! fiz uma projeto para apas 2014 que fazia a validação de dados através de Webservice deu um pouco de trabalho mais funcionou legal, não fiz uso do certificado, segue parte do código caso ajude fico feliz.
Frazato
Código: Selecionar todos
//------------------------------------------------
Static Function PegaRetorno_DMCARD()
LOCAL aRetorno:={} , cOk := .t.
//Local url := 'http://www.dmcardweb.com.br/siscred/servicoura_teste/serviceura.asmx?wsdl&tag='+strTran(Time(),":","")
Local Url := 'http://www.dmcardweb.com.br/siscred/WebservicoApas/service.asmx?wsdl'
? "Iniciando....Comunicando com o WebService..."+Time()
//Alerta(url)
xmldom = CREATEOBJECT("MSXML2.DOMDocument")
xmldom:async = .T.
xmldom:validateOnParse = .T.
xmldom:resolveExternals := .T.
xmldom:preserveWhiteSpace = .T.
xmldoc = CREATEOBJECT("MSXML2.XMLHTTP")
xmldoc:open("POST", url, .f.)
//xmldoc:SetRequestHeader( "Host" , "www.dmcardweb.com.br" )
xmldoc:SetRequestHeader( "Host" , "www.dmcardweb.com.br" )
xmldoc:SetRequestHeader( "Content-Type" , "text/xml; charset=utf-8" )
//xmldoc:SetRequestHeader( "SOAPAction" , "http://www.dmcardweb.com.br/siscred/servicoURA.asmx/Consulta" )
xmldoc:SetRequestHeader( "SOAPAction" , "http://www.comunix.net/servicos.asmx/Pdv_Cosulta" )
//-- Montando o Xml pra consulta
Texto := DadosDM()
//Alert(Texto)
xmldom:LoadXML(Texto)
IF xmldom:parseError:errorCode = 0
//? "XML Carregado"
ELSE
cErrorMsg = "Não foi possível carregar o documento pois ele não corresponde ao seu Schema"
cErrorMsg += cErrorMsg + " Linha: " + STR(xmldom:parseError:line) + cCRLF
cErrorMsg += cErrorMsg + " Caractere na linha: " + STR(xmldom:parseError:linepos) + cCRLF
cErrorMsg += cErrorMsg + " Causa do erro: " + xmldom:parseError:reason + cCRLF
cErrorMsg += "code: "+STR(xmldom:parseError:errorCode)
Alerta(cErrorMsg)
ENDIF
xmldoc:send(xmldom:xml)
//? "Comunicando com o WebService..."+Time()
DO WHILE xmldoc:readyState <> 4
MILLISEC(50)
ENDDO
Linha :=xmldoc:responseText
Linha2:=xmldoc:responseXML:xml
If !Empty(Linha2)
//? "OK-Comunicando com o WebService..."+Time()
oXMLRetorno := TOLEAUTO():New("Microsoft.XMLDOM")
lSuccess := oXMLRetorno:loadXML( Linha2 )
If lSuccess
//Alerta(Linha2)
cMsgRetorno:=oXMLRetorno:getElementsByTagName( "Pdv_CosultaResult" ):item(0):Text
DM_Nome_Cliente:=oXMLRetorno:getElementsByTagName( "Nome" ):item(0):Text
DM_Aniversario :=oXMLRetorno:getElementsByTagName( "Aniversario" ):item(0):Text
DM_Ponto_Sou :=oXMLRetorno:getElementsByTagName( "Pontos" ):item(0):Text
DM_UltimaCompra:= ""//oXMLRetorno:getElementsByTagName( "Data_Ultima_Consulta" ):item(0):Text
DM_MSG_Sou :=oXMLRetorno:getElementsByTagName( "Mensagem" ):item(0):Text
DM_MSG_Sou_limite:=oXMLRetorno:getElementsByTagName( "Limite_Aprovado" ):item(0):Text
DM_MSG_NIVER :=oXMLRetorno:getElementsByTagName( "Aniversario" ):item(0):Text
DM_MSG_Sou := Alltrim(Substr(DM_MSG_Sou,1,535))
DM_Ponto_Sou := Val(__PegaPonto(DM_Ponto_Sou))
//--- Granvando Log de Retorno Analise
// Pasta := "Retorno_DM"
GravaLog_WEBDM(Linha2)
*If !Empty(DM_Nome_Cliente)
* If !Empty(DM_MSG_Sou) // DM_MSG_Sou_limite
* If Alltrim(Hb_AnsiToOem(DM_MSG_Sou))==Hb_AnsiToOem("Você tem cartão pré-aprovado")
* *Alerta(Hb_AnsiToOem(DM_MSG_Sou)+chr(10)+;
* * Hb_AnsiToOem("Você tem cartão pré-aprovado"))
*
* //Alerta("ClienteSou.wav")
* C_PLAYSOUND("ClienteSou.wav") // Funwin.prg
* //C_PLAYSOUND("Sons_wav\Boatarde.wav") // Funwin.prg
*
* Endif
* Endif
*
* If !Empty(DM_MSG_NIVER)
* C_PLAYSOUND("Sons_wav\Parabens.wav") // Funwin.prg
* Endif
* Else
* DM_Nome_Cliente := ""
* cOk := .f.
* Endif
Else
DM_Nome_Cliente := ""
cOk := .f.
Endif
Endif
*Alert("Linha Text"+Linha)
*Alert("Linha2 XML"+Linha2)
RETURN cOk
//------------------------------------------------------
Static Function DadosDM()
Local cCodEstab := "17"//63719 // Codigo Estabelecimento Nr DM La Villa
Local cNumero := Alltrim(mCliente)
// Monta o documento XML conforme a estrutura definida para este Web Service
*POST /siscred/WebservicoApas/service.asmx HTTP/1.1
*Host: www.dmcardweb.com.br
*Content-Type: text/xml; charset=utf-8
*Content-Length: length
*SOAPAction: "http://www.comunix.net/servicos.asmx/Pdv_Cosulta"
sConteudo := ""
sConteudo += [<?xml version="1.0" encoding="utf-8"?>]
sConteudo += [<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">]
sConteudo += [<soap:Body>]
sConteudo += [<Pdv_Cosulta xmlns="http://www.comunix.net/servicos.asmx">]
sConteudo += [<Numero_CPF>]+cNumero+[</Numero_CPF>]
sConteudo += [<Codigo_Estabelecimento>]+cCodEstab+[</Codigo_Estabelecimento>]
sConteudo += [</Pdv_Cosulta>]
sConteudo += [</soap:Body>]
sConteudo += [</soap:Envelope>]
Return (sConteudo)
Consumir Webservice ( SOAP )
Enviado: 02 Set 2014 00:08
por Alexandre Silva
Obrigado..
Consegui ajustar enviar e obter retorno...
fiz ajustes no modelo que tinha postado inicialmente aqui.
Consumir Webservice ( SOAP )
Enviado: 11 Set 2014 21:08
por Alexandre Silva
Sobre SOAP ainda
Agora estou fazendo testes com outra seguradora...
mesma rotina.. se eu mando o xml por e-mail, conseguem processar..
se eu faço pela rotina do Harbour.. estou recebendo esse retorno..
Operation '' is not defined in the WSDL for this service
O suporte da Seguradora me retornou":
O erro apresentado acima refere-se ao segmento "SOAP-ENV:Fault", ou seja, uma falta, ou exceção
do protocolo Soap, não do webserver. A descrição "Operation '' is not defined in the WSDL for this service"
parece estar sendo originada do componente que está utilizando para consumir o serviço.
O que falta nessa ferramenta do harbour ??
Código: Selecionar todos
cWebService := "http://homologacao.averba.com.br/webserver/index.soap"
varqx:='xml.xml' // xml de um cte que vai..
sconteudo:=memoRead(varqx)
objXMLHTTP:=TOleAuto():New( "MSXML2.ServerXMLHTTP" )
objXMLHTTP:open( "POST", cWebService, .F. ) // Aponta para o Web Service
objXMLHTTP:send( sconteudo ) // Envia o documento XML para o Web Service
cResponseText := objXMLHTTP:responseText // XML:xml // Aqui e carregado o retorno do Web Service.
oXMLDoc := TOLEAUTO():New("Microsoft.XMLDOM") // Ativa objeto DOM
root := oXMLDoc:documentElement
oXMLDoc:async := .f. // Habilita leitura completa do documento
lSuccess := oXMLDoc:loadXML( cResponseText ) // Verifica o sucesso retorno
If lSuccess
vretorno:='retorno.xml'
HB_MemoWrit(vretorno,cResponseText)
cresposta := oXMLDoc:getElementsByTagName( "faultstring" ):Item(0):Text
else
cresposta:=cResponseText
endif
alert(cresposta)