otro mas con problemas con web service soap

521 views
Skip to first unread message

extremo

unread,
Jul 17, 2015, 10:58:23 AM7/17/15
to publice...@googlegroups.com
Hola Amigos

Debo llamar un web service que tiene SOAP y estoy muy pero muy perdido.

He realizado muchas pruebas y nada... les mando una prueba que he realizado

El link donde esta el web service es el siguiente:



oHTTP = create('MSXML2.XMLHTTP')
strPaquete = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cer="http://certificadorprevisional.fonasa.gov.cl.ws/">'
strPaquete = strPaquete + "<soapenv:Header/>"
strPaquete = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cer="http://certificadorprevisional.fonasa.gov.cl.ws/">' + CHR(13)
strPaquete = strPaquete + "<soapenv:Header/>" + CHR(13)
strPaquete = strPaquete + "<soapenv:Body>" + CHR(13)
strPaquete = strPaquete + "<cer:getCertificadoPrevisional>" + CHR(13)
strPaquete = strPaquete + "<cer:query>" + CHR(13)
strPaquete = strPaquete + "<cer:queryTO>" + CHR(13)
strPaquete = strPaquete + "<cer:tipoEmisor>3</cer:tipoEmisor>" + CHR(13)
strPaquete = strPaquete + "<cer:tipoUsuario>2</cer:tipoUsuario>" + CHR(13)
strPaquete = strPaquete + "</cer:queryTO>" + CHR(13)
strPaquete = strPaquete + "<cer:entidad>XXXXXXXXXX</cer:entidad>" + CHR(13)
strPaquete = strPaquete + "<cer:claveEntidad>XXXXX</cer:claveEntidad>" + CHR(13)
strPaquete = strPaquete + "<cer:rutBeneficiario>12966145</cer:rutBeneficiario>" + CHR(13)
strPaquete = strPaquete + "<!--Optional:-->" + CHR(13)
strPaquete = strPaquete + "<cer:dgvBeneficiario>3</cer:dgvBeneficiario>" + CHR(13)
strPaquete = strPaquete + "<cer:canal>10</cer:canal>" + CHR(13)
strPaquete = strPaquete + "</cer:query>" + CHR(13)
strPaquete = strPaquete + "</cer:getCertificadoPrevisional>" + CHR(13)
strPaquete = strPaquete + "</soapenv:Body>" + CHR(13)
strPaquete = strPaquete + "</soapenv:Envelope>" + CHR(13)
?strPaquete
oHTTP.setRequestHeader("Content-Type", "text/xml")
oHTTP.setRequestHeader("Content-Type", "text/xml")
oHTTP.send(strPaquete)
?oHTTP.responseText
_cliptext=oHTTP.responseText
oHTTP.setRequestHeader("SOAPAction", "urn:getCertificadoPrevisional")
oHTTP.setRequestHeader("soapenv", "urn:getCertificadoPrevisional")
oHTTP.send(strPaquete)

strPaquete lo saque de una prueba de conexion que realice con un programa que valida webservice SOAPUI y salia ese xml como respuesta:
en ese xml cuando cambio los valores de cer:rutBeneficiario y de cer:dgvBeneficiario me trae los datos sin problemas...
Todo esto probado desde SOAPUI.... pero desde fox pro nada me resulta.

Alguien me puede orientar o mostrar en donde me estoy equivocando?

Bendiciones

Jose Ramon Veliz Martinez

unread,
Jul 17, 2015, 11:15:14 AM7/17/15
to publice...@googlegroups.com, protech...@gmail.com
Buenos dias, deberias de verificar que el webservices te mande los datos no en un ARREGLO, sino como texto. Hay campos que Visual Fox no los trabaja.

extremo

unread,
Jul 17, 2015, 11:41:18 AM7/17/15
to publice...@googlegroups.com, spc.j...@gmail.com, protech...@gmail.com
Hola José

El proveedor del WS es una entidad de gobierno (ministerio de Salud) y ese web service lo usan en muchos lugares y dudo, pero dudo mucho que lo cambien porque yo no lo puedo leer. 
Hay que descartar fox pro para leer este web service?

Bendiciones

mapner

unread,
Jul 17, 2015, 12:01:48 PM7/17/15
to publice...@googlegroups.com, protech...@gmail.com
Sencillas sugerencias,

- Utiliza el comando TEXT TO ... ENDTEXT para que resulte más claro el XML que estás conformando

- Para probar el envío y la respuesta de un WS utiliza el aplicativo SopaUI (se baja de la web). Es muy práctico para testear servicios SOAP. Una vez que lo tienes probado en SoapUI ahí realizas la implementación en VFP.

Saludos

extremo

unread,
Jul 17, 2015, 12:07:40 PM7/17/15
to publice...@googlegroups.com, protech...@gmail.com
Hola Mapner...
Ya use el SOAPUI y funciona pero no ayo la forma de implementarlo en fox pro... algo me esta faltando y no logro descubrirlo. Llevo una semana intentandolo y ya me rendi, es por eso que acudi al foro.

Bendiciones


El viernes, 17 de julio de 2015, 11:58:23 (UTC-3), extremo escribió:

Jose Ramon Veliz Martinez

unread,
Jul 17, 2015, 12:15:18 PM7/17/15
to publice...@googlegroups.com, protech...@gmail.com
SET TALK OFF
SET SAFETY off
lcUser="test"
lcClave="xyz"
WAIT WINDOW "Aguarde un momento, conectandose al SERVIDOR ONLINE RECUPERANDO RESUMEN" nowait
LOCAL loConsultasControllerPort AS "XML Web Service"
* LOCAL loConsultasControllerPort AS "MSSOAP.SoapClient30"
* Do not remove or alter following line. It is used to support IntelliSense for your XML Web service.
*__VFPWSDef__: loConsultasControllerPort = https://XXXXX.com/XXX/XXX/index.php?r=consultas/consultas , ConsultasControllerService , ConsultasControllerPort
LOCAL loException, lcErrorMsg, loWSHandler
TRY
loWSHandler = NEWOBJECT("WSHandler",IIF(VERSION(2)=0,"",HOME()+"FFC\")+"_ws3client.vcx")
loConsultasControllerPort = loWSHandler.SetupClient("https://XXXXX.com/XXX/XXX/XXX/index.php?r=consultas/consultas", "ConsultasControllerService", "ConsultasControllerPort")
* Call your XML Web service here.  ex: leResult = loConsultasControllerPort.SomeMethod()
leResult = loConsultasControllerPort.actionGetComprasPendientes(lcUser, lcClave)
If Val(Left(leResult,4))>0 && exitoso el BLOQUEO
   lcLargo=LEN(leResult)
   lcveces=lcLargo/65
        lcCaracter1="|"
        lcCaracter2="&"
        lcConteo=1
        STORE "" TO code1,code2,code3,code4,code5,code6,Code7,lcCampo
        WAIT WINDOW "Recuperando Datos " nowait
* susp
   FOR x=1 TO lcLargo
*     WAIT WINDOW "Proceso numero "+STR(x) TIMEOUT 1
    lcTexto=SUBSTR(leResult,x,1)
    IF lcTexto#lcCaracter2 AND lcTexto#lcCaracter1 && si es & no lo suma a la variable
    lcCampo=lcCampo+lcTexto
ENDIF
    IF lcTexto=lcCaracter2 && Fin de Campo
    DO Case
    CASE lcConteo=1 && codigoOrde
code1=lcCampo
lcConteo=2
m.CodigoOrde=code1
    CASE lcConteo=2 && NumeroOrde
code2=lcCampo
lcConteo=3
m.NumeroOrde=Code2
    CASE lcConteo=3 &&Total
code3=lcCampo
lcConteo=4
m.Total=VAL(Code3)
    CASE lcConteo=4 && SubTotal
code4=lcCampo
lcConteo=5
m.Subtotal=VAL(code4)
    CASE lcConteo=5 && Estado
code5=lcCampo
lcConteo=6
m.Estado=Code5
    CASE lcConteo=6 && Impuesto
code6=lcCampo
lcConteo=7
m.Descuento=VAL(code6)
    CASE lcConteo=7 && Fecha
code7=lcCampo
lcConteo=8
m.Fecha=code7
    EndCase
lcCampo=""    
    ENDIF
IF lcConteo=8 OR lcTexto=lcCaracter1
m.Fecha=lcCampo
WAIT WINDOW "Extrayendo datos RESUMEN FASE 2" NOWAIT 
INSERT INTO DaTos FROM Memvar
SELECT Datos
SCATTER MEMVAR blank
ENDIF
    IF lcTexto=lcCaracter1 && Fin de linea
       STORE "" TO code1,code2,code3,code4,code5,code6,Code7,lcCampo
       lcConteo=1
*     Exit
    ENDIF
   ENDFOR
   SELECT datos
   GO top
Endif
CATCH TO loException
lcErrorMsg="Error: "+TRANSFORM(loException.Errorno)+" - "+loException.Message
DO CASE
CASE VARTYPE(loConsultasControllerPort)#"O"
* Handle SOAP error connecting to web service
CASE !EMPTY(loConsultasControllerPort.FaultCode)
* Handle SOAP error calling method
lcErrorMsg=lcErrorMsg+CHR(13)+loConsultasControllerPort.Detail
OTHERWISE
* Handle other error
ENDCASE
* Use for debugging purposes
MESSAGEBOX(lcErrorMsg,0,"SPC_SEGUNDA_FASE_RESUMEN",1500)
FINALLY
ENDTRY


Esa rutina de arriba utilizo con un Web Services de un cliente, el SOAP me da a mi la seguridad de que funciona y me manda los datos. Con Fox utilizo esto y los datos que me manda los voy recuperando caracter a caracter, hasta tener el campo del dato. Cuando termina de "desmembrar" lo recuperado lo grabo en mi tabla y listo.

Espero te sirva

Saludos

mapner

unread,
Jul 17, 2015, 12:17:13 PM7/17/15
to publice...@googlegroups.com, protech...@gmail.com
Para manipular HTTP uso el objeto  Msxml2.ServerXMLHTTP.6.0
Una vez hecho el SEND tendrías que chequear la propiedad  oHTTP.STATUS, si el estado es 200 es que anduvo OK, sino debes ver que código devuelve (400, 500, etc...)
A su vez es recomendable que el SEND se envuelva en un TRY CATCH ENDTRY para capturar el mensaje de un posible error

Saludos

extremo

unread,
Jul 20, 2015, 12:08:17 PM7/20/15
to publice...@googlegroups.com, protech...@gmail.com
Hola Jose

Probe tu codigo , pero no me funciona, creo que el problema esta en la siguiente linea:
loConsultasControllerPort = loWSHandler.SetupClient("http://www.webservicex.net/globalweather.asmx?WSDL","ConsultasControllerService" ,"ConsultasControllerPort")
yo la cambie por lo siguiente:
loConsultasControllerPort = loWSHandler.SetupClient("http://186.0.216.153:8080/Certificados/Previsional?wsdl", "getCertificadoPrevisional", "getCertificadoPrevisional")

segun yo esta mal eso que dice "getCertificadoPrevisional", pero si es eso, entonces ni idea de que es lo que debo colocar.

El error que dice es el siguiente:
ERROR:1924 loConsultasControllerPort is not an object

probe la linea sin parametros, de la siguiente forma:

loConsultasControllerPort = loWSHandler.SetupClient("http://186.0.216.153:8080/Certificados/Previsional?wsdl")

sale el siguiente error:
ERROR 1426 - OLE error code 0x800220006: Nombre desconocido.

Sigo aun perdido... 

gracias


El viernes, 17 de julio de 2015, 11:58:23 (UTC-3), extremo escribió:

Jose Ramon Veliz Martinez

unread,
Jul 20, 2015, 1:12:50 PM7/20/15
to publice...@googlegroups.com, protech...@gmail.com
En el SOAPUI te funciona, debes de copiar la URL que te da el SOPAu

leResult = loConsultasControllerPort.actionGetComprasPendientes(lcUser, lcClave)   este es el original, el tuyo deberia de ser asi

leResult = loConsultasControllerPort.getCertificadoPrevisional()    && en los parentesis deberian de ir los campos y clave para el webservices, 


Ya probastes en Visual, con el utiliarios del Web services que se ejecute?? Menu, en Tools, Task Pane, cargas Web services y alli lo publicas. Pones la direccion y lo ejecutas si todo resulta bien, deberia de darte el mismo formato que te envie, con la diferencia de los parametros a necesitar para ejecutar el web.

extremo

unread,
Jul 20, 2015, 3:33:00 PM7/20/15
to publice...@googlegroups.com, protech...@gmail.com
Gracias Jose

Despues de ver tu ejemplo y volver a revisar el  SOAPUI me di cuenta de mi error, lo hice de una manera mas corta, sin usar el _ws3client.vcx. Envío el codigo para que los otros colegas sepan como hacerlo, al menos otra manera de llamar un web service con SOAP y con clave .

TEXT TO strPaquete NOSHOW
<soapenv:Header/>
<soapenv:Body>
<cer:getCertificadoPrevisional>
<cer:query>
<cer:queryTO>
<cer:tipoEmisor>XX</cer:tipoEmisor>
<cer:tipoUsuario>XX</cer:tipoUsuario>
</cer:queryTO>
<cer:entidad>XXXXX</cer:entidad>
<cer:claveEntidad>XXXXXX</cer:claveEntidad>
<cer:rutBeneficiario>XXXXX</cer:rutBeneficiario>
<cer:dgvBeneficiario>XX</cer:dgvBeneficiario>
<cer:canal>XXX</cer:canal>
</cer:query>
</cer:getCertificadoPrevisional>
</soapenv:Body>
</soapenv:Envelope>
ENDTEXT
xmlhttp = CreateObject("MSXML2.ServerXMLHTTP.6.0")
xmlhttp.open("POST", "http://186.0.216.153:8080/Certificados/Previsional HTTP/1.1", .F.)
xmlhttp.setRequestHeader("Content-Type", "text/xml;charset=UTF-8")
xmlhttp.send(strPaquete)
xml = xmlhttp.responseText
?xml

Bendiciones a todos

El viernes, 17 de julio de 2015, 11:58:23 (UTC-3), extremo escribió:
Reply all
Reply to author
Forward
0 new messages