Entrada destacada

Solucion error AjaxControlToolkit requires ASP.NET Ajax 4.0 scripts

Ajax Control Toolkit en ASP.NET Ajax Library Detalles de la Versión :(AspNetAjaxLibraryBeta0911.zip application, 6490K, uploaded Nov 18 ...

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.


15 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
    Respuestas
    1. Nada más adiciona en el open usuario y contrasena:

      xmlhttp.open "POST", strURL, False, "usuario", "contrasena"

      Eliminar
  6. Muchas gracias estoy utilizando este código pero me devuelve un status 500 parece que si hace el open con la autenticación que le puse ya que se requiere en un webservices que estoy probando. Pero me devuelve ese error alguna idea ????? Gracias.

    ResponderEliminar
  7. cuando lo ejecuto me da mensaje de acceso denegado
    se produce en la linea siguiente:
    Call xmlhttp.send(strSoap)

    ResponderEliminar
  8. obtengo un mensaje de error cuando lo ejecuto:
    ACCESO DENEGADO
    en la linea: Call xmlhttp.send(strSoap)

    gracias por su aporte, ojala puedan resolver esto

    ResponderEliminar
  9. Me sale un error en el Call xmlhttp.send(strSoap), me dice Acceso denegado

    ResponderEliminar
  10. Muy buen aporte, toqueteando un poco pude obtener las cotizaciones del BCU (banco central del Uruguay)
    muchas gracias

    ResponderEliminar
  11. Podrías facilitarme el código?
    Gracias, Angel

    ResponderEliminar
    Respuestas
    1. Angel, ya no tengo ese código (ni siquiera el visual basic instalado), son muchos años ya de eso, pero todo el código es el que se indica y no hay mas que eso.

      Eliminar

Entradas populares