Con mucha ayuda de los artículos del foro sobre webservices, he podido consumir los webservices de un software de terceros en la empresa que trabajo, hasta ahí, todo un éxito.
Lo hago así:
- Code: Select all Expand view
#include "fivewin.ch"
FUNCTION WSInac2 //Entrada Desosado
LOCAL cXml, cErrorMsg, http, doc, cRespWS, cfecha
cfecha := '20/02/2017'
// objeto http
try
http:=createobject( "Microsoft.XMLHTTP")
catch
try
http:=createobject( "Microsoft.XMLHTTP")
catch
Alert("Error en la creacion del objeto Microsoft.XMLHTTP : " + Ole2TxtError())
return .F.
end
end
//Objeto XML
try
doc := CreateObject( "MSXML2.DOMDocument" )
catch
try
doc := CreateObject( "MSXML2.DOMDocument" )
catch
Alert("Error en la creacion del objeto MSXML2.DOMDocument : " + Ole2TxtError())
end
RETURN .F.
end
//XML con la consulta
cXml:=''
cXml+= '<?xml version="1.0" encoding="utf-8"?>' + CRLF
cXml+= '<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/">' + CRLF
cXml+= '<soap:Body>' + CRLF
cXml+= '<Desosado xmlns="http://gateway/inacapi/salidas">' + CRLF
cXml+= '<Fecha>' + cfecha + '</Fecha>' + CRLF
cXml+= '</Desosado>' + CRLF
cXml+= '</soap:Body>' + CRLF
cXml+= '</soap:Envelope>'
http:Open( "POST" , "http://un_server_local/inacapi/salidas.asmx" , .F. ) //llamas al URL donde se aloja el servicio Web y usas el método que necesitas
http:SetRequestHeader( "Content-Type" ,"text/xml; charset=utf-8")
http:SetRequestHeader( "SOAPAction" , "http://gateway/inacapi/salidas/Desosado" ) //ejecutas acción
http:SetRequestHeader( "Connection:", "Keep-Alive" )
http:SetRequestHeader( "Content-length: ", Str( Len( cXml ) ) )
doc:LoadXML( cXml ) // Carga el documento xml
IF doc:parseError:errorCode = 0
?'Documento xml cargado sin problemas'
ELSE
cErrorMsg = "No fue posible cargar documento pues este no corresponde a su Schema"
cErrorMsg = cErrorMsg + " Linea: " + STR(xmldom:parseError:line)
cErrorMsg = cErrorMsg + " Caracter en linea: " + STR(xmldom:parseError:linepos)
cErrorMsg = cErrorMsg + " Causa del error: " + xmldom:parseError:reason+" Codigo: "+STR(xmldom:parseError:errorCode)
msginfo(cErrorMsg)
ENDIF
TRY
http:send( doc:xml ) // Lo envio al WS
CATCH
cErrorMsg:="No Se Pudo Enviar Documento XML..."+ CRLF +"no fue posible conectar"
MsgInfo(cErrorMsg,"Intente Nuevamente")
return .f.
END
MsgInfo( "Xml Enviado!!" )
cRespWS := http:responseText
? ( cRespWS )
RETURN NIL
Con esto obtengo en cRespWS la respuesta del servicio web que es otro xml
Necesito pasar ahora esta variable a una dbf, he visto que xharbour tiene la clase TXmlDocument() y hay bastante información de como levanar el archivo xml y convertirlo en lo que uno quiera... el tema es que este xml no es un archivo, está en memoria en esta variable.
LA PREGUNTA ES:
¿ Cómo convierto una variable que contiene un xml en una dbf o en su defecto como la convierto en un archivo xml en disco que luego pueda pasar a dbf con TXmlDocument() ?