Attribute VB_Name = "Maps"
Function GetDirections(Origin As String, Destination As String) As String
    ' Create a WebClient for executing requests
    ' and set a base url that all requests will be appended to
    Dim MapsClient As New WebClient
    MapsClient.BaseUrl = "https://maps.googleapis.com/maps/api/"
    
    ' Create a WebRequest for getting directions
    Dim DirectionsRequest As New WebRequest
    DirectionsRequest.Resource = "directions/{format}"
    DirectionsRequest.Method = HttpGet
    
    ' Set the request format -> Sets {format} segment, content-types, and parses the response
    DirectionsRequest.Format = Json
    
    ' (Alternatively, replace {format} segment directly)
    DirectionsRequest.AddUrlSegment "format", "json"
    
    ' Add parameters to the request (as querystring for GET calls and body otherwise)
    DirectionsRequest.AddQuerystringParam "origin", Origin
    DirectionsRequest.AddQuerystringParam "destination", Destination
    
    ' Force parameter as querystring for all requests
    DirectionsRequest.AddQuerystringParam "sensor", "false"
    
    ' => GET https://maps.../api/directions/json?origin=...&destination=...&sensor=false
    
    ' Execute the request and work with the response
    Dim Response As WebResponse
    Set Response = MapsClient.Execute(DirectionsRequest)
    
    If Response.StatusCode = WebStatusCode.Ok Then
        ' Work directly with parsed json data
        Dim Route As Object
        Set Route = Response.Data("routes")(1)("legs")(1)
        
        GetDirections = "It will take " & Route("duration")("text") & _
            " to travel " & Route("distance")("text") & _
            " from " & Route("start_address") & _
            " to " & Route("end_address")
    Else
        GetDirections = "Error: " & Response.Content
    End If
End Function

Public Sub ProcessDirections(Response As WebResponse)
    If Response.StatusCode = WebStatusCode.Ok Then
        Dim Route As Dictionary
        Set Route = Response.Data("routes")(1)("legs")(1)

        Debug.Print "It will take " & Route("duration")("text") & _
            " to travel " & Route("distance")("text") & _
            " from " & Route("start_address") & _
            " to " & Route("end_address")
    Else
        Debug.Print "Error: " & Response.Content
    End If
End Sub

Function MapsClient() As WebClient
    Set MapsClient = New WebClient

    ' Set the base url for the service
    '
    ' All requests will be appended to the base url
    ' e.g.
    ' BaseUrl = https://api.service.com/
    ' RequestA -> https://api.service.com/RequestA
    ' RequestB -> https://api.service.com/RequestB
    '
    MapsClient.BaseUrl = "https://maps.googleapis.com/maps/api/"
End Function

Function DirectionsRequest(Origin As String, Destination As String) As WebRequest
    Set DirectionsRequest = New WebRequest
    DirectionsRequest.Resource = "directions/{format}"

    ' Set the request format (Set {format} segment, content-types, and parse the response)
    DirectionsRequest.Format = WebFormat.Json
    DirectionsRequest.AddUrlSegment "format", "json"

    ' Replace any {...} url segments
    ' e.g. Resource = "resource/{id}"
    ' Request.AddUrlSegment("id", 123) -> "resource/123"

    ' Add parameters to the request (querystring for GET calls and body for everything else)
    DirectionsRequest.AddQuerystringParam "origin", Origin
    DirectionsRequest.AddQuerystringParam "destination", Destination
    ' (or force as querystring)
    DirectionsRequest.AddQuerystringParam "sensor", "false"

    ' (GET, POST, PUT, DELETE, PATCH)
    DirectionsRequest.Method = WebMethod.HttpGet

    ' => GET https://maps.googleapis.com/maps/api/directions/json?origin=...&destination=...&sensor=false
End Function