Descomprimiendo cadenas de respuesta

Tutoriales, Visual Basic 2010

Este post es la parte 7 de 9 del artículo: Usando la API de Betfair

Algunas llamadas a la API devuelven datos como cadenas compactas en vez de arrays que facilitarían su uso, seguramente para disminuir el tamaño de la información recibida pues algunas respuestas pondrían contener mucha información. Descompactaremos los datos recibidos de getAllMarkets que vimos anteriormente.

Crearemos un nuevo módulo con botón derecho en el explorador de soluciones Agregar… ->Módulo…  Y le daremos de nombre “Unpack” Y añadimos lo siguiente:

[vb]
Class MarketDataType ‘For getAllMarkets data
Public marketId As Integer
Public marketName As String
Public marketType As String
Public marketStatus As String
Public eventDate As DateTime
Public menuPath As String
Public eventHeirachy As String
Public betDelay As Integer
Public exchangeId As Integer
Public countryCode As String
Public lastRefresh As DateTime
Public noOfRunners As Integer
Public noOfWinners As Integer
Public totalAmountMatched As Double
Public bspMarket As Boolean
Public turningInPlay As Boolean
End Class
[/vb]

Esta clase define la estructura de datos de cada mercado. Para saberlo debemos mirar la guía de la API para la clase en cuestión. En nuestro ejemplo miraríamos la clase getAllMarkets que está en la página 34 y en la tabla marketData tenemos todos los miembros de la clase.  Ahora en el mismo módulo añadimos:

[vb]
Class UnpackAllMarkets ‘For getAllMArkets
Public marketData As MarketDataType() = {} ‘The returned array of market data
Private Const BaseDate As DateTime = #1/1/1970#
Private Const ColonCode = “&%^@” ‘The substitute code for “:”

Sub New(ByVal MarketString As String)
Dim n As Integer, Mdata, Field As String()

Mdata = MarketString.Replace(“:”, ColonCode).Split(“:”) ‘Get array of Market substrings
n = UBound(Mdata) – 1
ReDim marketData(n)

For i = 0 To n
Field = Mdata(i + 1).Replace(“~”, “-“).Split(“~”) ‘Get array of data fields
marketData(i) = New MarketDataType
With marketData(i)
.marketId = Field(0) ‘Load the array items
.marketName = Field(1).Replace(ColonCode, “:”)
.marketType = Field(2)
.marketStatus = Field(3)
.eventDate = BaseDate.AddMilliseconds(Field(4))
.menuPath = Field(5).Replace(ColonCode, “:”)
.eventHeirachy = Field(6)
.betDelay = Field(7)
.exchangeId = Field(8)
.countryCode = Field(9)
.lastRefresh = BaseDate.AddMilliseconds(Field(10))
.noOfRunners = Field(11)
.noOfWinners = Field(12)
.totalAmountMatched = Val(Field(13))
.bspMarket = (Field(14) = “Y”)
.turningInPlay = (Field(15) = “Y”)

End With
Next
End Sub
[/vb]

Esta clase se encarga de descompactar los datos y devolverlos en forma de un array de tipo MarketDataType.  En el original habla de una varible llamada BaseDate establecida a 1 de enero de 1970 porque los datos de tiempo devueltos son milisegundos a partir de esa fecha y que no sabe porque. En programación es lo que llamamos Timestamp UNIX que es el tiempo transcurrido desde tal fecha, es muy usado en sistemas unix así como php y otros lenguajes de programación.

Si nos fijamos en los datos recibidos veremos que los diferentes mercados están delimitados por “:” y los diferentes datos del mercado por “~”. Si los datos contienen cualquiera de estos símbolos la API les pone el carácter escape “” delante. Como separaremos los datos por estos caracteres, para evitar que nos moleste lo que haremos será sustituir “:” por nuestra constante ColonCode (“&%^@”)  y “~” por “-” .

Después usaremos la función split para dividir la cadena MarketString en un array de subcadenas que lo guardaremos en Mdata(). Tener en cuenta que el elemento 0 estará vacío pues porque el primer dato de la cadena es “:”. Después separaremos cada subcadena delimitadas por “~”  y lo guardaremos en Field()

Después rellenaremos nuestro array de MarketTypeDate con los datos necesarios convirtiendolos a los timpos necesarios o sustituyendo el ColonCode por “:”

Para probarlo sustituiremos

[vb]                escribirLog(.marketData)[/vb]

por

[vb]
Dim AllMarkets As New UnpackAllMarkets(.marketData) ‘Create an object and unpack the string
With AllMarkets
For i = 0 To .marketData.Length – 1
With .marketData(i)
escribirLog(.marketId & ” ” & .marketStatus & ” ” & .marketName & ” ” & .menuPath)
End With
Next
End With
[/vb]

En el objeto AllMarkets de la clase UnpackAllMarkets a la que le pasamos la cadena compacta oMarketsResp.marketData.

Ahora ejecutamos nuestro proyecto para probarlo. Si queremos cambiar los datos que se muestran solo habría que cambiar la información que le pasamos a escribirLog.

Hay llamadas que finalizan con un “Compressed” como es por ejemplo GetMarketPricesCompressed donde actuaríamos de manera similar. Por lo general estas funciones también existen en su modo normal donde envían información legible pero la info pesa más e incluso las veces que podemos acceder a ellas por minuto según marca la API gratuita es mucho menor.

Fuente: Step 6. Unpacking Response Strings

Partes del artículo<< Acceso a la API ExchangeRestricciones de la API gratuita >>

Deja un comentario

  • (will not be published)


+ 6 = 9