Solicitud REST al Agente de servicios web desde Visual Basic 6

Objetivo

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:
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:
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.