Вы находитесь на странице: 1из 11

17/01/2011

Cmo... Cmo usar un servicio Web XM

el Guille, la Web del Visual Basic, C#, .NET y ms...


Lo+ - WinFX - .NET - A DO.NET - A SP.NET - Cmo... - Colabora - VB6 - A PI - HTML - Vista - Links Foros

Cmo... en .NET

Usar un servicio Web XML desde VB6


Publicado el 20/Jun/2003 Actualizado el 29/Jun/2003 (14/Dic/03) Modificacin para NO usar el Internet Transfer Control para acceder al servicio Web (29/Jun/03)

Virtual Tree .NET Control Advanced data binding Fast virtual loading of data www.infralution.com Curso Visual Basic.net Aprende Cmoda y Rpidamente Desde Tu Casa. Infrmate aqu!
mexico.seas.es

Cursos diseo y animacin editorial,web, modelado,animacin photoshop, maya, 3dstudio, premiere kmmx.mx

Introduccin
S, ya se que si vamos a crear un c liente de Visual Basic 6.0, no debera estar en la secc in de .NET, pero... como de lo que se trata es de usar un Servic io Web c reado con un lenguaje de .NET Framework (en particular c on C#), pues c reo que "tambin" debera estar en esta secc in... De lo que se trata es de saber qu es lo que tenemos que hacer para poder c rear un c liente (una aplicacin) de Visual Basic clsico para poder usar un servicio Web creado c on .NET. Lo bueno de usar los servic ios Web es que al ac cederse a ellos mediante internet, no debe preoc uparnos si est hec ho en .NET o no... lo importante es que podemos usarlo y eso es lo que aqu vamos a ver:

Cmo usar un servicio Web XML desde VB6


elguille.info//clienteVB6servicioWeb.htm 1/11

17/01/2011

Cmo... Cmo usar un servicio Web XM

(o cmo crear un cliente VB6 para usar un servicio Web XML)


Empecemos por lo que nec esitamos para poder crear el proyecto (o usar el cdigo del ejemplo inc luido en el fic hero zip). 1- Lo primero es el Visual Basic 6.0 (se supone que funcionar con el VB5, pero no lo he comprobado) 2- En el proyecto se usar el c ontrol Microsoft Internet Transfer Control (INET) para ac ceder al sitio en el que est alojado el servicio Web (aunque sea en el propio equipo) 3- Tambin se usar una referencia a Microsoft XML versin 2 (cualquiera posterior tambin valen) 4- Si vas a tener los servic ios Web en tu propio equipo, necesitars el Windows XP Profesional (o el Windows 2000) con el IIS instalado (para poder usarlo desde, por ejemplo, loc alhost), adems de tener instalado el .NET Framework SDK, ya que los servicios Web de .NET nec esitan la infraestructura del .NET (elemental), pero esto ltimo slo si no vas a usar el servicio Web que est public ado en mis pginas de Costasol. Una vez aclarado el tema de los requisitos, vamos a la explic ac in de cmo crear el cliente en VB6 para ac ceder a un servic io Web, en partic ular ser el servicio Web que convierte de grados c entgrados a Fahrenheit (Conversor.asmx, cuyo c digo puedes ver si sigues este link). Nota: Si quieres probar el servicio Web desde internet, tendrs que usar esta direc cin: http://www.elguille.info/Net/WebServices/conversor.asmx desde ella puedes probarlo. Parte del cdigo usado para enviar al servic io Web se consigue de la desc ripcin que se muestra en el explorador, por ejemplo, la forma de llamar a c ada una de las funciones. Por tanto, este ejemplo que te voy a mostrar slo es vlido para este servicio Web, en otra oc asin veremos cmo crear un cliente genrico para cualquier servicio Web, en ese ejemplo, veremos cmo saber qu func iones exporta el servic io Web y los parmetros que necesita recibir, para ello necesitaremos examinar y c omprender el c ontenido un fic hero del tipo WSDL (Web Service Desc ription Language, lenguaje de descripcin de servicio Web), pero, eso ser en otra ocasin. Cuando mandamos la informacin al servic io Web, tenemos que hac erlo usando los protocolos que el .NET entiende, el usado en este ejemplo es SOAP, no voy a entrar en detalles, simplemente decirte que el formato usado para la comunic ac in entre un servic io Web y el c liente siempre ser usando XML (de ah el nombre de estos servicios Web), por tanto el cdigo SOAP que te voy a mostrar (el c ual est tomado, c omo te c oment antes de la pgina mostrada por el explorador) est en ese formato, esa es la razn de que tengamos una referencia a Mic rosoft XML versin 2, ya que usaremos algunos de las c lases inc luidas en ella para poder manejar el cdigo XML, bueno, vale, no me enrollo ms, aqu tienes el c digo de una de las funciones, en partic ular la func in que convierte de grados Centgrados a Fahrenheit:

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.o <soap:Body> <CaF xmlns="http://elGuille/WebServices"> <valor>double</valor> </CaF> </soap:Body> </soap:Envelope>

Cuando mandemos este cdigo al servic io Web, tendremos que incluir en el sitio que est marc ado c on negrita (la palabra double) el valor del parmetro que queremos pasarle a esa func in. Esto lo haremos usando la clase DOMDocument del la librera msxml. El c digo sera algo as:

elguille.info//clienteVB6servicioWeb.htm

2/11

17/01/2011

Cmo... Cmo usar un servicio Web XM

Private Const cSOAPCaF = _ "<?xml version=""1.0"" encoding=""utf-8""?>" & _ "<soap:Envelope xmlns:xsi=""http:"//www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http:/ "<soap:Body>" & _ "<CaF xmlns=""http:"//elGuille/WebServices"">" & _ "<valor>1</valor>" & _ "</CaF>" & _ "</soap:Body>" & _ "</soap:Envelope>"

Dim parser As DOMDocument Set parser = New DOMDocument ' cargar el cdigo SOAP para CaF parser.loadXML cSOAPCaF ' ' Indicar el parmetro a enviar parser.selectSingleNode("/soap:Envelope/soap:Body/CaF/valor").Text = txtC.Text

Con esta ltima lnea lo que hacemos es asignar el parmetro que queremos pasarle a la func in CaF, la c ual espera un valor de tipo doble en un parmetro llamado valor. Una vez que tenemos el cdigo XML c on los datos a enviar al servicio Web, usaremos el Internet Transfer para hacer ese envo, de eso se encarga la siguiente lnea:

' Usar el control Inet para realizar la llamada al servicio Web Inet1.Execute txtURL.Text, "POST", parser.xml, "Content-Type: text/xml; charset=utf-8" & vbCrLf

Una vez que se haya ejecuta este comando, el servicio Web nos devolver la respuesta, (inc luso si se produc e algn error). Para recibir (e interpretar) la respuesta que nos mande el servicio Web, seguiremos usando el c ontrol Inet, en particular el evento StateChanged, veamos el cdigo:

elguille.info//clienteVB6servicioWeb.htm

3/11

17/01/2011

Cmo... Cmo usar un servicio Web XM

Private Sub Inet1_StateChanged(ByVal State As Integer) ' If (State = icResponseCompleted) Then ' icResponseCompleted = 12 Dim s As String ' ' Leer los datos devueltos por el servidor s = Inet1.GetChunk(4096) ' ' Poner los datos en el analizador de XML Dim parser As DOMDocument Set parser = New DOMDocument parser.loadXML s ' On Error Resume Next

txtF.Text = parser.selectSingleNode("/soap:Envelope/soap:Body/CaFResponse/CaFResult").T End If End Sub

Qu es lo que se hac e en este evento? Se comprueba si el estado del control es correc to (la desc ripcin del estado ic ResponseCompleted es: La solic itud se c omplet y se rec ibieron todos los datos), es decir, que si State vale 12 quiere decir que tenemos la respuesta del servidor, as que, leemos esos datos, se los pasamos al objeto XML para que nos resulte ms fc il interpretarlos y mostramos el resultado rec ibido en una caja de textos. Nota: Es importante detectar los errores, ya que si la cadena que se mand al servic io Web no es correcta, se produc ir un error al leer el valor, sobre todo si la cadena recibida no est en formato XML, c osa que oc urrir si, por ejemplo si en la direc cin indic ada no est el servic io Web, en este caso ser recibir una pgina "normal" de HTML indic ando que no se ha encontrado (el tpic o error 440). Y as a grandes rasgos esto es lo que nec esitamos para crear el cliente de VB6, poc a cosa verdad? El problema es saber qu c digo hay que usar para las llamadas a las distintas funciones, por suerte, si acc edemos a un servic io Web desde el explorer, ste nos mostrar una pgina c on lo necesario para crear el cdigo que nec esitamos. En la siguiente figura vers a qu me refiero:

elguille.info//clienteVB6servicioWeb.htm

4/11

17/01/2011

Cmo... Cmo usar un servicio Web XM

Figura 1, el cdigo SOAP para llamar a la funcin del servicio Web S, ya se que eso no es muy ac laratorio que digamos, pero... una vez que se sabe c mo "entenderlo", la c osa resulta ms fcil... yo, la verdad es que cuando vea ese cdigo, pues... c omo si nada... pero, por suerte, cay en mis manos un libro en el que, si bien no se explica a fondo c mo hac er esto, en la web del mismo s que se inclua un ejemplo, el cual me ha servido para hacer este que te muestro hoy... que no te c reas que yo me lo se todo... que tambin leo a otros autores..., en este caso es David S. Platt y su libro Introducing .NET (que me lo mandaron la gente de MSDN Latinoamrica al c onseguir la primera estrella del desarrollador 5 estrellas, que todo hay que decirlo). Bueno, te dejo el cdigo completo, as como una c aptura del formulario adems de, por supuesto, dejarte en un zip el cdigo de ejemplo. La captura del formulario de ejemplo:

elguille.info//clienteVB6servicioWeb.htm

5/11

17/01/2011

Cmo... Cmo usar un servicio Web XM

Figura 2, Captura del formulario en tiempo de ejecucin

El link al c digo completo (se incluye el fic hero del servic io Web y el fichero WSDL) ClienteVB6CF.zip 10.20 KB

Nos vemos. Guillermo P.S. Rec uerda que dentro de poco publicar el c digo genric o para acc eder a c ualquier servicio Web. En ese ejemplo, mostrar la forma de crear una serie de colecc iones con las distintas funciones que e incluyen en el servic io Web as como cada uno de los parmetros que rec ibe c ada una de las funciones. Pero eso ser en unos das... o lo mismo maana... quin sabe?

Cdigo para Visual Basic 6


Este es el c digo del formulario: '-----------------------------------------------------------------------------' Cliente VB6 del servicio Web conversor de C a F (18/Jun/03) ' ' Basado en un ejemplo del libro: Introducing .NET de David S. Platt ' ' Guillermo 'guille' Som, 2003 '-----------------------------------------------------------------------------Option Explicit Private Enum tipoConversion deCaF deFaC End Enum Private tipo As tipoConversion

' Estas definiciones estn tomadas de lo mostrado en el explorador ' al seleccionar cada una de las funciones del servicio Web Private Const cSOAPCaF = _ "<?xml version=""1.0"" encoding=""utf-8""?>" & _ "<soap:Envelope xmlns:xsi=""http:"//www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http:/ "<soap:Body>" & _ "<CaF xmlns=""http:"//elGuille/WebServices"">" & _ "<valor>1</valor>" & _ "</CaF>" & _ elguille.info//clienteVB6servicioWeb.htm 6/11

17/01/2011

Cmo... Cmo usar un servicio Web XM "</CaF>" & _ "</soap:Body>" & _ "</soap:Envelope>"

Private Const cSOAPFaC = _ "<?xml version=""1.0"" encoding=""utf-8""?>" & _ "<soap:Envelope xmlns:xsi=""http:"//www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http:/ "<soap:Body>" & _ "<FaC xmlns=""http:"//elGuille/WebServices"">" & _ "<valor>1</valor>" & _ "</FaC>" & _ "</soap:Body>" & _ "</soap:Envelope>"

Private Sub cmdC2F_Click() tipo = deCaF Dim parser As DOMDocument Set parser = New DOMDocument ' cargar el cdigo SOAP para CaF parser.loadXML cSOAPCaF ' ' Indicar el parmetro a enviar parser.selectSingleNode("/soap:Envelope/soap:Body/CaF/valor").Text = txtC.Text ' ' Mostrar el cdigo XML enviado al servicio Web Text1.Text = parser.xml ' Usar el control Inet para realizar la operacin HTTP POST Inet1.Execute txtURL.Text, "POST", parser.xml, "Content-Type: text/xml; charset=utf-8" & vb End Sub

Private Sub cmdF2C_Click() tipo = deFaC Dim parser As DOMDocument Set parser = New DOMDocument ' cargar el cdigo SOAP para FaC parser.loadXML cSOAPFaC ' ' Indicar el parmetro a enviar parser.selectSingleNode("/soap:Envelope/soap:Body/FaC/valor").Text = txtF.Text ' ' Mostrar el cdigo XML enviado al servicio Web Text1.Text = parser.xml ' Usar el control Inet para realizar la operacin HTTP POST Inet1.Execute txtURL.Text, "POST", parser.xml, "Content-Type: text/xml; charset=utf-8" & vb End Sub Private Sub Form_Load() Text1.Text = "Cliente VB6" & vbCrLf & "del Servicio Web Conversor de C a F" End Sub Private Sub Inet1_StateChanged(ByVal State As Integer) ' If (State = icResponseCompleted) Then ' icResponseCompleted = 12 Dim s As String ' ' Leer los datos devueltos por el servidor s = Inet1.GetChunk(4096) Text1.Text = s ' ' Poner los datos en el analizador de XML Dim parser As DOMDocument Set parser = New DOMDocument parser.loadXML s ' On Error Resume Next

elguille.info//clienteVB6servicioWeb.htm

7/11

17/01/2011

Cmo... Cmo usar un servicio Web XM ' If tipo = deCaF Then txtF.Text = parser.selectSingleNode("/soap:Envelope/soap:Body/CaFResponse/CaFResult Else txtC.Text = parser.selectSingleNode("/soap:Envelope/soap:Body/FaCResponse/FaCResult End If ' If Err.Number > 0 Then Text1.SetFocus End If End If End Sub

El cdigo del servicio Web creado con C#

Este es el c digo usado para c rear el servic io Web. Estar dentro de un fichero llamado Conversor.asmx el c ual tendr que estar copiado en una carpeta del servidor Web loc al (si tu intencin es probarlo sin estar c onec tado a Internet). <%@ WebService Language="c#" Class="CelsiusFahrenheit.Conversor" %> using System.Web.Services; namespace CelsiusFahrenheit { /// /// Descripcin breve de Conversor. /// [WebService(Namespace="http:"//elGuille/WebServices", Description="Conversor de grados Fahrenheit a grados centgrados (Celsius)")] public class Conversor { // const double fc = (5.0 / 9.0); // [WebMethod(Description="Convierte de Fahrenheit a Celsius, devuelve un valor Double")] public double FaC(double valor) { return ((valor - 32) * fc); } [WebMethod(Description="Convierte de Celsius a Fahrenheit, devuelve un valor Double")] public double CaF(double valor) { return (valor / fc + 32); } // } }

Modificacin para NO usar el Internet Transfer Control para acceder al servicio Web (29/Jun/03) En el ejemplo que te mostr arriba, se utiliza el control INET (Internet Transfer Control) para acc eder al servicio Web, tanto para enviar los datos c omo para rec ibirlos, pero si no quieres no hac e falta ya

elguille.info//clienteVB6servicioWeb.htm

8/11

17/01/2011 Cmo... Cmo usar un servicio Web XM que el Microsoft XML version 2.0 incluye un objeto para poder hacer esta tarea, se trata de XMLHTTPRequest. Este objeto contiene una serie de mtodos que nos permite enviar un c omando al servicio Web para mandarle la informac in y tambin nos permite rec ibir los datos que el servic io Web nos enva.
Veremos el cdigo que habra que c ambiar para que func ione el proyecto para acc eder al servicio Web conversor de temperaturas. Lo primero que no nec esitamos es el control Inet, por tanto puedes quitarlo del formulario, as como la referencia que tenemos (en Proyec to/Componentes...). Tambin puedes quitar el evento Intet1_Statechanged ya que no lo necesitaremos. Aqu (dentro de unas lneas) te voy a mostrar el nuevo c digo. Lo primero que tendrs que hac er es sustituir el cdigo de los eventos Clic k de los dos botones de c onversin, adems de aadir un par de nuevos proc edimientos para enviar y recibir la informac in del servicio Web. Aunque antes te voy a explic ar un poco c mo funciona el objeto XMLHTTPRequest y cmo usarlo. Cuando enviamos un c omando POST (ahora veremos c mo), se enva el c omando al servicio Web (igual que hac amos con el control Inet) y el servicio Web nos devolver una respuesta, esa respuesta tendr que proc esarla tambin el objeto XMLHTTPRequest. Como puede ser que la respuesta tarde en llegar, se podra hac er que se nos notificara c uando esa respuesta llegue (forma asnc rona) o tambin podemos esperar hasta que la respuesta llegue y despus continuar (forma sncrona). Esta ltima ser la forma que vamos a utilizar, ya que la otra (la asncrona) necesita algo de ms cdigo e incluso la creacin de una clase, que sera la que rec ibiera la notific ac in de que se ha terminado de rec ibir los datos desde el servidor. Nota: Si quieres ver cmo se hac e esto ltimo te rec omiendo que te bajes el Microsoft XML 4.0 Parser SDK y en la documentacin est c mo hac erlo, (este otro link te llevar a la doc umentac in de MSXML 4.0 SDK en lnea y en ingls). Si tienes la documentacin del mencionado SDK puedes buscar estos temas: Use the onReadyStateChange Property (Visual Basic) Make XML Requests Over HTTP (Visual Basic) Program with DOM in Visual Basic Bueno, ahora si vamos a ver el cdigo. Si quieres bajarte el cdigo ya "hec ho", pulsa este link. ClienteVB6CF2.zip 8.91 KB El c digo de los dos eventos Click (este c digo tendrs que reemplazarlo del c digo mostrado anteriormente)

elguille.info//clienteVB6servicioWeb.htm

9/11

17/01/2011

Cmo... Cmo usar un servicio Web XM

Private Sub cmdC2F_Click() tipo = deCaF ' Dim parser As DOMDocument Set parser = New DOMDocument ' cargar el cdigo SOAP para CaF parser.loadXML cSOAPCaF ' ' Indicar el parmetro a enviar parser.selectSingleNode("/soap:Envelope/soap:Body/CaF/valor").Text = txtC.Text ' ' Mostrar el cdigo XML enviado al servicio Web Text1.Text = parser.xml ' ' enviarComando parser.xml, "http:"//elGuille/WebServices/CaF" ' End Sub Private Sub cmdF2C_Click() tipo = deFaC ' Dim parser As DOMDocument Set parser = New DOMDocument ' cargar el cdigo SOAP para FaC parser.loadXML cSOAPFaC ' ' Indicar el parmetro a enviar parser.selectSingleNode("/soap:Envelope/soap:Body/FaC/valor").Text = txtF.Text ' ' Mostrar el cdigo XML enviado al servicio Web Text1.Text = parser.xml ' ' enviarComando parser.xml, "http:"//elGuille/WebServices/FaC" ' End Sub

El nuevo cdigo para enviar el comando al servic io Web y el que proc esa el cdigo rec ibido del servic io Web.

elguille.info//clienteVB6servicioWeb.htm

10/11

17/01/2011

Cmo... Cmo usar un servicio Web XM

Private Sub enviarComando(ByVal sXml As String, ByVal sSoapAction As String) ' Enviar el comando al servicio Web ' ' usar XMLHTTPRequest para enviar la informacin al servicio Web Dim oHttReq As XMLHTTPRequest Set oHttReq = New XMLHTTPRequest ' ' Enviar el comando de forma sncrona (se espera a que se reciba la respuesta) oHttReq.open "POST", txtURL.Text, False ' las cabeceras a enviar al servicio Web ' (no incluir los dos puntos en el nombre de la cabecera) oHttReq.setRequestHeader "Content-Type", "text/xml; charset=utf-8" oHttReq.setRequestHeader "SOAPAction", sSoapAction ' enviar el comando oHttReq.send sXml ' ' este ser el texto recibido del servicio Web procesarRespuesta oHttReq.responseText ' End Sub

Private Sub procesarRespuesta(ByVal s As String) ' procesar la respuesta recibida del servicio Web Text1.Text = s ' ' Poner los datos en el analizador de XML Dim parser As DOMDocument Set parser = New DOMDocument parser.loadXML s ' On Error Resume Next ' If tipo = deCaF Then txtF.Text = "Error" txtF.Text = parser.selectSingleNode("/soap:Envelope/soap:Body/CaFResponse/CaFResult").T Else txtC.Text = "Error" txtC.Text = parser.selectSingleNode("/soap:Envelope/soap:Body/FaCResponse/FaCResult").T End If ' If Err.Number > 0 Then Text1.SetFocus End If End Sub

Si observas los cambios, te dars c uenta que usando el objeto XMLHTTPRequest tenemos que indicar las c abeceras enviadas al servic io Web se indic a usando el mtodo setRequestHeader y el c digo XML se enva c on el mtodo send. En fin... espero que ahora sepas otra forma de c omunicarte con un servic io Web XML creado c on .NET Nos vemos. Guillermo

elguille.info//clienteVB6servicioWeb.htm

11/11