Public/Invoke-FrigateApi.ps1

function Invoke-FrigateApi {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName)]
        [ValidateScript({ TestSession -Session $_ -ErrorAction Stop })]
        [object]
        $Session = (GetLastSession -ErrorAction Stop),

        [Parameter(Mandatory)]
        [string]
        $Path,

        [Parameter()]
        [string]
        $Method = 'Get',

        [Parameter()]
        [System.Collections.IDictionary]
        $Body,

        [Parameter()]
        [System.Collections.IDictionary]
        $Query
    )

    process {
        $builder = [uribuilder]$Session.BaseUri
        $builder.Path += $Path.TrimStart('/')
        if ($PSCmdlet.MyInvocation.BoundParameters.ContainsKey('Query')) {
            $queryParams = [System.Web.HttpUtility]::ParseQueryString([String]::Empty)
            foreach ($key in $Query.Keys) {
                $queryParams.Add($key, $Query[$key])
            }
            $builder.Query = $queryParams.ToString()
        }

        $splat = @{
            Uri         = $builder.Uri
            Method      = $Method
            WebSession  = $Session.WebSession
            ContentType = 'application/json'
        }

        if ($PSCmdlet.MyInvocation.BoundParameters.ContainsKey('Body')) {
            $data = @{}
            foreach ($key in $Body.Keys) {
                $data[$key] = $Body[$key]
            }
            $splat.Body = [pscustomobject]$data | ConvertTo-Json
            $splat.ContentType = 'application/json'
        }

        # TODO: Do error handling if Frigate API has consistent documented error responses
        Invoke-RestMethod @splat
    }
}