lunes, 8 de diciembre de 2008

Consumir Web Services con Visual Basic

Vamos a crear una aplicación en Visual Basic para conectarnos a un Web Services que nos entregará los indicadores económicos de Chile, los cuales podemos usar en cualquier aplicación si la necesidad de tener que ingresar nosotros mismos estos valores a una base de datos. Empecemos.


Comencemos por crear un nuevo proyecto




Los controles que agregaremos son los siguientes:




Luego guardamos el proyecto como “Consulta_WS.vbp” y el formulario como “Form_WS.frm”.


Ahora que ya tenemos todo listo, nuestro formulario debería quedar así:




Antes de comenzar a escribir código en nuestro proyecto, necesitamos agregar una referencia a “Microsoft XML, V3.0” y eso lo hacemos de:




Luego buscamos “Microsoft XML, V3.0” y la seleccionamos.




Hacemos clic en Aceptar y ya estamos listos.


Nuestro siguiente paso será agregar un Módulo a nuestro proyecto.





Le dejamos el nombre que nos da por defecto (Module1) y escribimos la siguiente función:

Function InvokeWebService(strSoap, strSOAPAction, strURL, ByRef xmlResponse) As Boolean
Dim xmlhttp As MSXML2.XMLHTTP30
Dim blnSuccess As Boolean

Set xmlhttp = New MSXML2.XMLHTTP30
xmlhttp.open "POST", strURL, False
xmlhttp.setRequestHeader "Man", "POST " & strURL & " HTTP/1.1"
xmlhttp.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
xmlhttp.setRequestHeader "SOAPAction", strSOAPAction
Call xmlhttp.send(strSoap)

If xmlhttp.Status = 200 Then
blnSuccess = True
Else
blnSuccess = False
End If

Set xmlResponse = xmlhttp.responseXML
InvokeWebService = blnSuccess
Set xmlhttp = Nothing
End Function



Ahora que ya tenemos lista la función que se encargará de conectarse al Web Services, nos queda poder llamarla desde nuestro botón “Consultar”. Damos doble clic sobre el botón y escribimos:


Private Sub Consultar_Click()
Dim xmlResponse As MSXML2.DOMDocument30
Dim strSoap As String
Dim strSOAPAction As String
Dim strWsdl As String

strSoap = Soap.Text
strSOAPAction = Action.Text
strWsdl = Wsdl.Text
If InvokeWebService(strSoap, strSOAPAction, strWsdl, xmlResponse) Then
Resultado.Text = xmlResponse.xml
Else
Resultado.Text = "Error"
End If

Set xmlResponse = Nothing
End Sub



Bueno, ya tenemos lista nuestra aplicación que se encargará de consultar un Web Services, pero ahora debemos aprender como usarla.

Para nuestro ejemplo, vamos a consultar la página de Indicadores Financieros de Chile desde la siguiente dirección (siempre que el servicio se encuentre disponible, o sino, pueden usar otro web services): http://www.desachile.com. Una vez aquí buscamos la dirección que nos llevará a la página del Web Services http://www.desachile.com/webservice.asmx


Analicemos un poco esta página. En el link “Service Description”, si haces clic sobre el, veremos que nos lleva a la página http://www.desachile.com/webservice.asmx?WSDL en donde WSDL son las siglas de Web Services Description Language, un formato XML que se utiliza para describir los Servicios Web. Volvamos atrás.


Si hacemos clic en el Link “Indicadores”, nos llevará a http://www.desachile.com/webservice.asmx?op=Indicadores que es la página que nos interesa, por que nos dirá que información debemos enviar para consultar el Web Services de Indicadores Financieros.


Fijémonos en SOAP 1.1


La primera sección nos indica que es lo que debemos enviar y la segunda sección nos indica que es lo que recibiremos. Como vemos, debemos enviar un XML con una fecha de consulta y nos retornará un XML con los resultados.


Vamos a copiar la primera sección y pegarla en nuestra aplicación en el cuadro que tenemos para el Soap. No olviden colocar la fecha de consulta con el formato año mes día (ej: 20081203):


<?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:Body>
<Indicadores xmlns="Indicadores">
<Fecha>20081203</Fecha>
</Indicadores>
</soap:Body>
</soap:Envelope>


Ahora copiamos el SOAPAction ("Indicadores/Indicadores") y lo pegamos en Action de nuestra aplicación sin las comillas.


Ya solo nos queda la dirección Wsdl que como ya vimos antes es: http://www.desachile.com/webservice.asmx?WSDL la copiamos y la pegamos en nuestra aplicación.


Ya podemos hacer clic en consultar y obtendremos el XML con los indicadores.




Si ordenamos el resultado tendremos:


<?xml version="1.0" ?>

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<IndicadoresResponse xmlns="Indicadores">
<IndicadoresResult>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="indicadores">
<xs:complexType>
<xs:sequence>
<xs:element name="id" type="xs:int" minOccurs="0" />
<xs:element name="uf" type="xs:double" minOccurs="0" />
<xs:element name="usd" type="xs:double" minOccurs="0" />
<xs:element name="euro" type="xs:double" minOccurs="0" />
<xs:element name="utm" type="xs:double" minOccurs="0" />
<xs:element name="tcm" type="xs:double" minOccurs="0" />
<xs:element name="fecha" type="xs:int" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<NewDataSet xmlns="">
<indicadores diffgr:id="indicadores1" msdata:rowOrder="0">
<id>432</id>
<uf>21429.37</uf>
<usd>666.84</usd>
<euro>847.53</euro>
<utm>37652</utm>
<tcm>127.49</tcm>
<fecha>20081203</fecha>
</indicadores>
</NewDataSet>
</diffgr:diffgram>
</IndicadoresResult>
</IndicadoresResponse>
</soap:Body>
</soap:Envelope>


Ahora ya solo queda recorrer el XML para obtener los valores, pero eso se los dejo a ustedes.

Saludos y espero les sirva.


5 comentarios:

  1. Hola que tal porfavor no se si se trata del tema pero me podrias ayudar a obtener el tipo de cambio de esta pagina http://www.sunat.gob.pe/cl-at-ittipcam/tcS01Alias?mes=02&anho=2013 a un formulario de visual basic 6.0

    ResponderEliminar
  2. Mil gracias =) Si me sirvió 100 puntos

    ResponderEliminar
  3. Muchas gracias buen aporte.
    Una pregunta si el WS tiene autenticacion con usuario y contraseña, como seria aqui?

    ResponderEliminar
  4. Buen aporte!
    Una pregunta me puedes ayudar.
    Tengo que enviar un xml a un web service con autenticacion (Usuario y contraseña) y recibir respuesta de entregado.
    Aqui como seria?
    Gracias por tu aporte!

    ResponderEliminar
  5. Excelente aporte, yo tengo que enviar datos pero con usuario y contraseña como podria hacerlo?

    ResponderEliminar

Entradas populares