Sample code for 30+ languages & platforms
VB.NET Requires Chilkat v11.5.0+

Box: Poll User Events and Save a Checkpoint

See more Box Examples

Poll the authenticated user event stream in bounded batches. The local JSON checkpoint keeps processed event IDs and the next stream position. This single-process demonstration logs events; a production worker should commit its business action, deduplication record, and cursor transactionally and prune old IDs.

See the Box API guide for setup and the complete workflow.

Chilkat VB.NET Downloads

VB.NET
Dim success As Boolean = False

'  Requires Chilkat 11.5.0 or later and a previously unlocked Chilkat bundle.
'  See Global Unlock Sample.
'  Guide: Box API Guide.

success = False

'  Supply an unexpired token obtained with one of the Box authentication examples.
'  A token represents a particular user or service account. IDs must be accessible to it.
Dim curl As New Chilkat.HttpCurl
curl.SetVar("access_token","BOX_ACCESS_TOKEN")

Dim state As New Chilkat.JsonObject
Dim files As New Chilkat.FileAccess
Dim statePath As String = "qa_data/box_events_state.json"
If (files.FileExists(statePath) = True) Then
    success = state.LoadFile(statePath)
    If (success <> True) Then
        Debug.WriteLine(state.LastErrorText)
        Exit Sub
    End If

    If (state.HasMember("position") <> True) Then
        Debug.WriteLine("Invalid checkpoint: position missing.")
        Exit Sub
    End If

Else
    '  "now" starts a new subscription. It deliberately skips historical events.
    state.UpdateString("position","now")
End If

curl.SetVar("position",state.StringOf("position"))
Dim page As New Chilkat.JsonObject
Dim seenPath As New Chilkat.StringBuilder
Dim eventId As String
Dim nextPosition As String
Dim batch As Integer = 0
Dim i As Integer
Dim count As Integer
Dim more As Boolean = True
While (more = True) And (batch < 20)
    curl.ClearTargetOutput("*")
    Dim authorizedCommand1 As New Chilkat.StringBuilder
    authorizedCommand1.SetString("curl -X GET ""https://api.box.com/2.0/events?stream_type=all&stream_position={{position}}&limit=100"" -H ""Authorization: Bearer {{access_token}}""")
    Dim headerReplacement1 As Integer = authorizedCommand1.Replace("{{access_token}}",curl.GetVar("access_token"))
    success = curl.DoYourThing(authorizedCommand1.GetAsString())
    If ((success <> True) Or (curl.StatusCode <> 200)) Then
        Debug.WriteLine("Box request failed. HTTP status: " & curl.StatusCode)
        Debug.WriteLine("Failure reason: " & curl.FailReason)
        Debug.WriteLine(curl.ResponseBodyStr)
        Exit Sub
    End If

    success = curl.GetResponseJson(page)
    If (success <> True) Then
        Debug.WriteLine(curl.LastErrorText)
        Exit Sub
    End If

    count = page.SizeOfArray("entries")
    i = 0
    While i < count
        page.I = i
        eventId = page.StringOf("entries[i].event_id")
        If (eventId = "") Then
            Debug.WriteLine("Event without an event_id; checkpoint not advanced.")
            Exit Sub
        End If

        seenPath.Clear()
        seenPath.Append("seen.")
        seenPath.Append(eventId)
        If (state.HasMember(seenPath.GetAsString()) = False) Then
            '  Replace this logging with your idempotent business operation.
            '  Record success only after that operation succeeds.
            Debug.WriteLine(eventId & " " & page.StringOf("entries[i].event_type") & " " & page.StringOf("entries[i].source.id"))
            state.UpdateBool(seenPath.GetAsString(),True)
        End If

        i = i + 1
    End While
    nextPosition = page.StringOf("next_stream_position")
    If (nextPosition = "") Then
        Debug.WriteLine("Missing next_stream_position; checkpoint not advanced.")
        Exit Sub
    End If

    more = (count > 0) And (nextPosition <> curl.GetVar("position"))
    state.UpdateString("position",nextPosition)
    success = state.WriteFile(statePath)
    If (success <> True) Then
        Debug.WriteLine(state.LastErrorText)
        Exit Sub
    End If

    curl.SetVar("position",nextPosition)
    batch = batch + 1
End While
Debug.WriteLine("Checkpoint saved. Run again later to continue polling.")