Solicitud REST al Agente de servicios web desde Visual Basic 6
Objetivo
-
Explicar de forma clara y precisa cómo es el manejo de JSON en el lenguaje Visual Basic 6.
-
Explicar las funciones y objetos que ofrece Visual Basic 6 para realizar una petición HTTP por medio del verbo POST.
-
Presentar un ejemplo funcional donde se consuma recursos de la API que ofrece el agente de servicios web de ContaPyme desde el lenguaje de programación Visual Basic 6.
JSON
Visual basic 6 como tal no tiene objetos nativos para el manejo de JSON pero se puede realizar este manejo mediante la librería llamada “JsonConverter”. Esta librería ofrece diferentes funcionalidades para el manejo de JSON a través de objetos de tipo “Dictionary” los cuales se pueden implementar bajo el módulo de clase llamado Dictionary.
Instalación de los módulos para manejo de JSON
Módulo Dictionary
Primero necesitaremos adicionar el módulo de clase para el manejo de diccionarios para el lenguaje de VB6 llamado
“VBA-Dictionary” el cual podremos descargar desde su web oficial aquí
https://github.com/VBA-tools/VBA-Dictionary, una vez descargado procedemos a adicionarlo a nuestro proyecto realizando los siguientes pasos:
-
Nos posicionamos sobre nuestro proyecto en Visual Basic 6, presionamos clic derecho sobre el nombre del proyecto, nos posicionamos sobre la opción de “Agregar” y damos clic en la opción llamada “Módulo de clase”.
-
En la ventana modal se nos presenta nos posicionamos sobre la pestaña llamada existente, buscamos y seleccionamos el archivo llamado “Dictionary.cls”, paso seguido presionamos clic sobre la opción abrir.
Módulo JSONConverter
Para agregar este módulo es requerido haber agregado al proyecto el módulo de clase llamado
“Dictionary” puesto que es requerido por este. Este módulo ofrecerá las funciones y objetos necesarios para el manejo de JSON, permitiendo convertir cadenas de texto para convertirlas en diccionarios y viceversa, para descargar esta librería lo podremos hacer desde la web oficial en
https://github.com/VBA-tools/VBA-JSON, y una vez descargada ejecutar los siguientes pasos:
-
Nos posicionamos sobre nuestro proyecto en Visual Basic 6, presionamos clic derecho sobre el nombre del proyecto, nos posicionamos sobre la opción de “Agregar” y damos clic en la opción llamada “Módulo”.
En la ventana modal se nos presenta nos posicionamos sobre la pestaña llamada existente, buscamos y seleccionamos el archivo llamado “JsonConverter.bas”, paso seguido presionamos clic sobre la opción abrir.
De esta manera tendremos las librerías agregadas a nuestro proyecto en Visual Basic 6 podremos trabajar con JSON.
Objetos JSON
El manejo de objetos JSON se realiza bajo objetos de tipo Dictionary y utilizando los métodos que este ofrece para adicionar pares (add), asignar un valor o agregarlos (item), remover una llave (remove), verificar si una llave existe (Exists) o para eliminar todos los ítems de un objeto (removAll).
|
Código Visual Basic 6
|
Representación en JSONObject
|
|
Dim Obj = as Dictionary
Set Obj = New Dictionary
Set Obj.Item(“name”) = “foo”
'Obj.add(“name”,”foo”)
Set Obj.Item(“balance”) = 1000.21
'Obj.add(“balance”, 1000.21)
Set Obj.Item(“italia”) = true
'Obj.add(“italia”, true)
|
{
"name": " foo ",
"num": 100,
"balance": 1000.21,
"Italia": true
}
|
Arreglos JSON
El manejo de arreglos JSON en Visual Basic 6 lo podemos hacer mediante arreglo convencionales los cuales se pueden agregar como valores a objetos previamente definidos o bajo objetos de tipo “Collection” según sea el caso, es decir si se necesita un JSONArray que sólo tendrá llaves de tipo String es más fácil definirlo con arreglos convencionales, pero si se necesita definir un arreglo con diferentes tipos de datos es mejor definirlo como una colección (Collection).
|
Código Visual Basic 6
|
Representación en JSONArray
|
|
Dim Arr as Collection
Set Arr = New Collection
Arr.add "foo"
Arr.add 100
Arr.add 1000.21
Arr.add true
Arr.add new Dictionary
|
{
"name": " foo ",
"num": 100,
"balance": 1000.21,
"Italia": true
}
|
Serializar y de serializar un JSON
El módulo de JSONConverter también ofrece funcionalidades que permiten convertir una cadena de texto en un objeto JSON la cual será muy útil para convertir la respuesta de la petición, para esto podremos usar la propiedad ParseJson del objeto JsonConverter:
|
Código Visual Basic 6 para decodificar un JSON
|
|
Dim str as String = '{
“name”:”foo”,
“num”:100,
“balance”: 1000.21,
“Italia”:true,
“obj”:{……}
}'
Dim obj as Dictionary
Set obj = JsonConverter.ParseJson(str)
|
La serialización que podemos definir como el proceso para convertir un JSON a una cadena de texto, la cual será muy útil para convertir un objeto Dictionary a un string para enviarlo en una petición la podremos realizar mediante el método ConvertToJson de la clase JsonConvert.
|
Código Visual Basic 6
|
Representación del JSON
|
|
Dim Obj = as Dictionary
Set Obj = New Dictionary
Obj.add(“name”,”foo”)
Obj.add(“balance”, 1000.21)
Obj.add(“italia”, true)
Obj.add(“child”, New Dictionary)
Dim Str as String
str = JsonConvert. ConvertToJson(Obj)
|
{
"name": " foo ",
"num": 100,
"balance": 1000.21,
"is_vip": true,
"child":{}
}
|
Request
Objeto WinHttp.WinHttpRequest
Esta objeto es utilizado para realizar las solicitudes de recursos a un servidor, para esto proporciona propiedades y método comunes para enviar y recibir datos de un recurso identificado por una URL o URI.
|
Código Visual Basic 6 para definir una un objeto WinHttp.WinHttpRequest y hacer una solicitud
|
|
//Se define la variable con el objeto
Dim winH As WinHttp.WinHttpRequest
//Se crea el Objeto para realizar la petición
Set winH = new WinHttp.WinHttpRequest
//En esta variable llegará la respuesta como un string
Dim strResult as String
//Se define la URL a donde se realizará la solicitud
Dim URL as String
URL = 'http://example.com/idrecurso'
//Se abre la conexión con el servidor definiendo el verbo
winH.Open "post", URL
//Se genera la solicitud enviando un JSONObject
winH.Send “{}”
//Por último se lee la respuesta en formato string
strResult = winH.ResponseText
|
Ejemplo funcional
El siguiente ejemplo realiza una petición que muestra el listado de terceros obtenidos de un agente de servicios web de ContaPyme (ASW) en un ListBox. Para esto primero se debe hacer GetAuth contra el agente para obtener el KeyAgent con el cual se realizará la solicitud de listado de terceros.
PostRequest
El objetivo de esta función es realizar una petición POST a una URL que recibe como parámetro, para esto la función también recibe un objeto de tipo Dictionary que será el que enviará en el cuerpo de la petición, la función después de hacer la solicitud retornara un objeto de tipo Dictionary que se ha entregado como respuesta.
Private Function PostRequest(URL As String, Data As Dictionary) As Dictionary
'Se define el Objeto para realiza la petición POST
Dim winH As WinHttp.WinHttpRequest
'Se crea el objeto previamente definido
Set winH = New WinHttp.WinHttpRequest
'Se realiza la apertura de la conexión a la URL con verbo POST
winH.Open "post", URL
'Se envía el string con el JSON de datos
winH.Send JsonConverter.ConvertToJson(Data)
'Se retorna el diccionario
Set PostRequest = JsonConverter.ParseJson(winH.ResponseText)
End Function
GetAuth
Esta función construirá el JSON necesario para la autenticación contra el Agente de servicios web (ASW), paso seguido realizará la solicitud de GetAuth, y retornará el KeyAgente entregado por el servidor. Para esto tomará los valores de usuario y contraseña de los dos textbox creados en diseño.
Private Function GetAuth() As String
'Se define el objeto que se enviará
Dim JSONSend As Dictionary
'Se define el objeto que tendrá los parámetros a enviar
Dim JParams As Dictionary
'Se crean los objetos previamente definidos
Set JSONSend = New Dictionary
Set JParams = New Dictionary
'Se adicionan los parámetros necesarios para hacer el GetAuth
JParams.Item("email") = EdUser.Text
JParams.Item("password") = EdPassword.Text
JParams.Item("idmaquina") = "1"
'Se define el arreglo parámetros generales que se enviaran
Dim ArrParam(3) As String
'Se agregan los 4 parámetros al arreglo
ArrParam(0) = JsonConverter.ConvertToJson(JParams)
ArrParam(1) = "0"
ArrParam(2) = "1001"
ArrParam(3) = "123"
'Se agrega el arreglo al objeto a enviar
JSONSend.Item("_parameters") = ArrParam
'Se define la URL a donde se realizará la petición
Dim URL As String
URL = "http://local.insoft.co:9000/datasnap/rest/TBasicoGeneral/""GetAuth""/"
'Se define el objeto que tendrá la respuesta
Dim JSONResult As Dictionary
'Se realiza la petición con los datos previamente definidos
Set JSONResult = PostRequest(URL, JSONSend)
'Se defien el resultado como vacio por defecto
GetAuth = ""
'Se verifica que el JSON tenga un valor
If JsonConverter.ConvertToJson(JSONResult) <> "" Then
'Se verifica que no se existan eventualidades en la petición
If JSONResult("result")(1)("encabezado")("resultado") <> "true" Then
MsgBox JSONResult("result")(1)("encabezado")("mensaje")
Else
'Se asgina el keyAgente como resultado que se retornará
GetAuth = JSONResult("result")(1)("respuesta")("datos")("keyagente")
End If
End If
End Function
GetListTerceros
Esta función recibe el keyAgente obtenido previamente y construye el JSON para realizar la petición de obtener el listado de terceros, como resultado esta función retornara un Dictionary con el listado de terceros.
Private Function GetListTerceros(keyAgent As String) As Dictionary
'Se define y asigna valor a la URL que se solicitará
Dim URLPost As String
URLPost = "http://local.insoft.co:9000/datasnap/rest/TCatTerceros/""GetListaTerceros""/"
'Se define el objeto que se enviará
Dim JSONSend As Dictionary
'Se define el objeto que tendrá los parámetros a enviar
Dim JParams As Dictionary
'Se crean los objetos previamente definidos
Set JSONSend = New Dictionary
Set JParams = New Dictionary
'Se agrega el objeto con los datos de paginación que se enviaran
Set JParams.Item("datospagina") =
JsonConverter.ParseJson(" {""cantidadregistros"":""99"",""pagina"":""1""}")
'Se agregan el arreglo de campos que se solicitaran en el listado
Set JParams.Item("camposderetorno") =
JsonConverter.ParseJson(" [""init"",""ntercero"",""napellido""]")
'Se define el arreglo parámetros generales que se enviaran
Dim arrParams(3) As String
'Se agregan los 4 parámetros al arreglo
arrParams(0) = JsonConverter.ConvertToJson(JParams)
arrParams(1) = keyAgent
arrParams(2) = "1001"
arrParams(3) = "5555"
'Se agrega el arreglo al objeto a enviar
JSONSend.Item("_parameters") = arrParams
'Se define el objeto que tendrá la respuesta
Dim ObjResult As Dictionary
'Se realiza la petición a la URL definida con el JSON previo
Set ObjResult = PostRequest(URLPost, JSONSend)
'Se define que el resultado será la respuesta que se encuentra dentro del JSON entregado
Set GetListTerceros = ObjResult("result")(1)("respuesta")
End Function
Implementación de las funciones
La implementación se realiza sobre el evento clic del botón, en este lo primero que se hace es obtener el keyAgente y validar que este sea diferente de vacío, paso seguido se obtiene el listado de terceros el cual es almacenado en un diccionario el cual se recorrerá para obtener cada uno de los objetos que se encuentran definidos en este y agregarlos al control ListBox.
Private Sub ButtonAction_Click()
'Se eliminan los elementos del listBox
List1.Clear
'Se define la variable que tendrá el keyAgente
Dim sKey As String
'Se solicita el KeyAgente
sKey = GetAuth()
'Se verifica que el keyAgente tenga un valor
If sKey <> "" Then
'Se difine la variable que tendra la lista de terceros
Dim arrTerceros As Dictionary
'Se define el string que tendra la información de cada tercero
Dim StrTem As String
'Se solicita y almacena el listado de terceros
Set arrTerceros = GetListTerceros(sKey)
'Se define una variable i para recorrer el listado
Dim i As Integer
'Se recorre el listado de terceros retornado
For i = 1 To arrTerceros("datos").Count - 1
'Se obtiene los datos de cada registro
StrTem = arrTerceros("datos")(i)("init")
StrTem = StrTem & " " & arrTerceros("datos")(i)("ntercero")
StrTem = StrTem & " " & arrTerceros("datos")(i)("napellido")
'Se agrega cada registro como item al ListBox
List1.AddItem (StrTem)
Next
End If
End Sub
Resultado de la implementación
©2016 InSoft Todos los derechos reservados.