Consumo de web service

347 views
Skip to first unread message

Susasel

unread,
Jul 8, 2010, 6:24:28 PM7/8/10
to Mundo Visual FoxPro
Hola!
Necesito consumir un web service desde VFP 8.
No he trabajado con este tipo de servicios antes, alguno me puede
ayudar?

http://mail.tntperu.com.pe:8080/axis2/services/listServices

http://mail.tntperu.com.pe:8080/axis2/services/TarifaService?wsdl


Logré registrar el web service, pero al tratar de jalar los datos me
devuelve un error :

Error: 1429 - OLE IDispatch exception code 0 from Connector:
Connector:Connection failed or server refused connection (request
might exceed MaxPostSize). HRESULT=0x800A151E - Client:An
unanticipated error occurred during the processing of this request.
HRESULT=0x800A151E - Client:Sending the Soap message failed or no
recognizable response was received HRESULT=0x800A151E -
Client:Unspecified client error. HRESULT=0x800A151E..
Connector:Connection failed or server refused connection (request
might exceed MaxPostSize). HRESULT=0x800A151E - Client:An
unanticipated error occurred during the processing of this request.
HRESULT=0x800A151E - Client:Sending the Soap message failed or no
recognizable response was received HRESULT=0x800A151E -
Client:Unspecified client error. HRESULT=0x800A151E

El proveedor del web service me dice que es debido a que VFP está
tratando de leer un valor como resultado cuando el resultado es una
estructura de dos valores : (tarifa, error)

Gracias!!

TurbiSoft

unread,
Jul 9, 2010, 9:22:04 AM7/9/10
to Mundo Visual FoxPro
Saludo colega, hace dos o tres meses estube igual que tu, envie el
mensaje para de veces, para nadie me pudo ayudar, algunos, inmagino,
por falta de tiempo y otros por desconocimiento.

Para comenzar fuera de la informacion que te ofresca el archivo WSDL,
seria bueno que te suminsitren una informacion detalladad de los
metdos a invocar, con cuales parametros y que tipo de datos devuleven,
los posibles rangos de estos, etc.

En mi caso me suminsitraron un "pequeno" manual de 89 paginas y con la
descripcion tecnica del web services completo.

Pero entrando en Materia te sugiero que emplees el objeto
MSXML2.XMLHTTP, busca documentacion de este, es excelente.

tambien debes documentarte por lo menos de forma basica acerca de XML
y o ojbeto DOM, para manipular el Response del WS, si este te llega en
forma de objeto DOM, y poder el script xml
de este.

Debes documentarte de los objetos foxpro XMLAdapter, y las funciones
XMLToCursor() y CursotToXML(). Ten en cuenta que XML es sencible a
Mayusculas y Minusculas.
En el ejemplo que te anexo utilizo el Text to cRequest...EndText, para
construir los request, revisa este comando fox es excelente y soporta
mail merge para las variables y compos de tablas.

Por ultimo chequea el Seteo Set Textmerge On, para insertar variables
y funciones en el testo contenido en Text...EndText.

Todo este resumen me llevo entre dos y tres meses puyando y leyendo.
hay mucha domentacion de WS en fox en la red


A continuacion te paso un segmento de codigo para loguearme en el WS,
ya que este tiene seguridad integrada:

Release oWS_Bancomer,oHTTP,loDom
Public oWS_Bancomer As "XML Web Service"
Public oHTTP As msxml2.XMLHTTP
Public loDom As msxml2.DOMDocument && (Soportado por VFP8)
Public cSessionID,cTimeOut As Character
Local lcOPCODE,lcROCESS_MSG,
lcERROR_FULL,lcPROCESS_DT,lcPROCESS_TM,nDEPOSITS
Local
lcAGENT_CD,cUSER_DOMAIN,cUSER_NAME,cUSER_PASS,cSessionID,cSes_TimeOut
As String
cUSER_DOMAIN="Usuario"
cUSER_NAME="userName"
cUSER_PASS="miclave"
lcAGENT_CD="micodigo
Store "" To lcOPCODE,lcROCESS_MSG,
lcERROR_FULL,lcPROCESS_DT,lcPROCESS_TM
Store 0 To nDEPOSITS
Store "" To cSessionID,cSes_TimeOut
Local loException, lcErrorMsg, loWSHandlerm,lcWSDL,lcXML


lcWSDL="https://mi.paginacomercial.ws//algo/transaction.asmx?WSDL"
loWSHandler = Newobject("WSHandler",Iif(Version(2)=0,"",Home()+"FFC\")
+"_ws3client.vcx")
** Objeto cliente Soap
oWS_Bancomer =
loWSHandler.SetupClient(lcWSDL,"TransactionSr","TransactionSrSoap")
loDom = Createobject('MSXML2.DomDocument')


* Para incrustar campos y variables en texto XML
cOld_TEXT = Set("TEXTMERGE")
Set Textmerge On
Set Textmerge Delimiters To "<<",">>"

*-* Llamo Metodo Login
Do Metodo_USRL With cUSER_DOMAIN,cUSER_NAME,cUSER_PASS,lcAGENT_CD
If (Used("tmpLogin"))
Select tmpLogin
If NOT Vartype(tmpLogin.opcode)="C"
Messagebox("Solicitud de Login fue Rechazada!!",48,"Falló el Login")
* =Liberar_Objetos()
Return .F
Endif
If tmpLogin.Status="Succesfull" && Succesfull
Wait Window "Login: Sesion Iniciada Satisfactoriamente....." Nowait
Store tmpLogin.SESSION_ID To cSessionID
Store tmpLogin.SESSION_TIMEOUT To cSes_TimeOut
Store tmpLogin.opcode To lcOPCODE
Store tmpLogin.process_dt To lcPROCESS_DT
Store tmpLogin.process_tm To lcPROCESS_TM
Store tmpLogin.process_msg To lcROCESS_MSG
Else
Messagebox("Solicitud de Login fue Rechazada!!",48,"Falló el Login")
* =Liberar_Objetos()
Return .F
Endif
Else
Messagebox("No se creo el cursor tmpLogin",48,"Falló el Login")
* =Liberar_Objetos()
Return .F.
Endif

******************************
Procedure Metodo_USRL
*******************************
Lparameters cUSER_DOMAIN,cUSER_NAME,cUSER_PASS,lcAGENT_CD
Local cRequest As String
TEXT TO cREQUEST NOSHOW TEXT PRETEXT 7
<?xml version="1.0" encoding="utf-8"?>
<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/">
<soap:Header>
<ADDRESSING xmlns="http://www.mywebsite.com/ws/">
<FROM/>
<TO/>
</ADDRESSING>
<SECURITY xmlns="http://www.mywebsite.com/ws/">
<USER_DOMAIN><<cUSER_DOMAIN>></USER_DOMAIN>
<USER_NAME><<cUSER_NAME>></USER_NAME>
<USER_PASS><<cUSER_PASS>></USER_PASS>
<SESSION_ID>1</SESSION_ID>
</SECURITY>
</soap:Header>
<soap:Body>
<ExecTR xmlns="http://www.mywebsite.com/ws/">
<REQUEST>
<AGENT_TRANS_TYPE_CODE>USRL</AGENT_TRANS_TYPE_CODE>
<AGENT_CD><<lcAGENT_CD>></AGENT_CD>
</REQUEST>
</ExecTR>
</soap:Body>
</soap:Envelope>
ENDTEXT

Local loErrorTry
loErrorTry = .Null.
Try
* Turbi: lo cambio por la rutina
oHTTP = Createobject('MSXML2.XMLHTTP')
*!* If Not CreaObjXMLHTTP(@oHTTP)
*!* Error 'No se ha podido crear referencia al objeto de envío de e-
mail'
*!* Endif

*************-Creamos el Sobre - ************
strPaquete= cRequest

** Direccion Web Services
oHTTP.Open("post", "https://mi.paginacomercial.ws//algo/
transaction.asmx?WSDL", .F.)
oHTTP.setRequestHeader("Content-Type", "text/xml;charset=utf-8")

*-Decimos qué objeto queremos instanciar y qué método y en qué lugar
está
oHTTP.setRequestHeader("SOAPAction", "http://www.mywebsite.com/ws//
ExecTR")

*- Enviamos el Request
oHTTP.Send(strPaquete)

If oHTTP.Status = 200
*- La respuesta en formato Text
strReturn = oHTTP.responseText
Else
Messagebox("Error: (" + TRANSFORM(oHTTP.Status) + ") " +
oHTTP.statusText,16,"Metodo login Web Services")
*- Libera el objeto
* oHTTP = NULL
Endif
Catch To loErrorTry
Finally
Endtry

*- Si hubo error
If Vartype(loErrorTry) = 'O'
messagebox('Mensaje de error: ' +loErrorTry.LineContents+SPACE(1)+
loErrorTry.Message,48,"Atencion")
Return .F.
Endif

* Respuesta: objeto DOM
loDom = oHTTP.ResponseXML
lcXML = loDom.XML
=Strtofile(loDom.XML,"Login.xml")

* loDOM.async = .f.
* loDOM.validateOnParse = .F. && No valida al cargar el doc. xml
*=Cargar_oDOM(loDom)

If (Used("tmpLogin"))
Use In tmpLogin
Endif
*Cursortoxml("cursor", "login.xml", 1, 512, 0,"mySchema.xsd","http://
www.microsoft.com/mySchema.xsd")
Xmltocursor(loDom.getElementsByTagName("ExecTRResult").Item(0).XML,"tmpLogin")
Endproc

Susasel

unread,
Jul 9, 2010, 5:16:11 PM7/9/10
to Mundo Visual FoxPro
Gracias, voy a comenzar a documentarme con las sugerencias que me
alcanzaste.
Espero conseguir pronto algún resultado.
> Xmltocursor(loDom.getElementsByTagName("ExecTRResult").Item(0).XML,"tmpLogi­n")
> Endproc
Reply all
Reply to author
Forward
0 new messages