martes, 4 de junio de 2013

Cliente REST en VBA

A raíz de unas utilidades que hemos de desarrollar en nuestros verticales surgió la necesidad de crear clientes

REST

desde aplicaciones que usan lenguajes

VBA

(asp, Visual Basic 6.0, Macros de Excel, vbs)… Trabajando en estos entornos no encontraremos una dll oficial que nos sirva para conectar a un servicio

REST

lo cual tiene bastante sentido porque

VBA

dejó de ampliarse ya hace 10 años con el paso a .NET y

REST

es un tema emergente que se ha puesto de moda estos últimos años.

Aún así teniendo en cuenta que

REST

no es más que una petición

HTTP

, usando la librería msxml.dll que aún podemos descargar en la página de Microsoft se podría crear un cliente

REST

sin problemas en este tipo de aplicaciones.

Con esta dll ya podremos realizar llamadas

HTTP

controlando el verbo y las cabeceras de la petición, pero no incorpora utilidades para convertir cadenas

JSON

a objetos ni viceversa. Tirando de google un poco veo que hay gente que opta por usar las dll que .NET sí que mantiene donde es bastante sencillo realizar este tipo de acciones con parseJSON y métodos del estilo, para ello generan una dll desde .NET que vinculan desde las aplicaciones

VBA

usando interops o convirtiendo la dll .NET en objeto COM. En nuestro caso dada la naturaleza del parque de aplicaciones que mantengo actualmente y teniendo en cuanto como se despliegan las aplicaciones a los usuarios era una solución un poco engorrosa. Hemos optado por descargar esta solución Visual Basic 6.0 y aprovechar las utilidades

JSON

en nuestras aplicaciones.

Una vez tenemos estos 2 requisitos veamos como implementar un GET de ejemplo y a partir de ahí cada uno podría montarse su clase proxy genérica para trabajar contra distintos servicios que sigan el patrón

REST

desde aplicaciones VBA. El GET haremos que ataque al servicio

REST

(artículo) que creamos hace unas semanas en

areaTIC

y debería devolvernos la misma información que si usamos el cliente genérico .NET que creamos también hace unas semanas en

areaTIC

.
Option Explicit

Private m_url as string 
Private m_Service as string 

Public Function GetFromWebAPI(ByVal strValue As String) As ADODB.Recordset
    Dim oHttReq As MSXML2.XMLHTTP
    On Error GoTo errorFunction
           
   'Definimos URL y Servicio, en este caso es específico la URL se corresponde con el proyecto Web MVC API que tengo en mi IIS local. 
   m_url  = "http://localhost/WebApi/Api"
   m_Service = strValue

    ' Enviar el comando al servicio Web
    ' usar XMLHTTPRequest para enviar la información al servicio Web
    Set oHttReq = New XMLHTTP

    ' Enviar el comando de forma síncrona 
    oHttReq.open "GET", m_url & "/" & m_Service, False

    ' las cabeceras a enviar en la petición HTTP
    ' oHttReq.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
    
   ' enviar el comando
    Dim body As String
    oHttReq.send
    body = oHttReq.responseText
    
    Dim oRstDatos As ADODB.Recordset
    Set oRstDatos = ParseJSON(body)
    
    Set oHttReq = Nothing
    Exit Function
errorFunction:
    Err.Raise Err.Number
End Function
Option Explicit

Private Sub Command1_Click()
    Dim rest_client As New RESTClient
    Dim rs As ADODB.Recordset
    Set rs = rest_client.GetFromWebAPI("articulo")
    
    rs.MoveFirst
    MsgBox rs.GetString
End Sub

Comentar que hemos usado como base para el método parseJSON el código fuente descargado del enlace que os presentaba al principio del artículo pero hemos añadido un método para convertir el diccionario de valores en un Recordset dinámico ya que dada la naturaleza de nuestras aplicaciones

VBA

nos resultaba muy útil. No hay problema en subir el código de ejemplo si alguien está interesado hacérnoslo saber que os paso el proyecto de test que he usado para realizar el cliente

REST VBA

. Como siempre espero que el artículo os resulte interesante, cualquier duda o valoración hacerla llegar a través de comentarios, emails o como buenamente os apetezca. Recuerda que puedes seguir

areaTIC

en las redes sociales, anímate a participar!

No hay comentarios:

Publicar un comentario en la entrada