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