param(
    [parameter(Mandatory=$true)][String]$InstanceName,
    [parameter(Mandatory=$true)][String]$Table,
    [String]$Query,
    [String]$Fields,
    [Int32]$Limit,
    [Switch]$SetCredential
)

Add-Type -AssemblyName System.Web

$InstanceName = -Join ("https://", $InstanceName, ".service-now.com/api/now/table/")
$Query = [System.Web.HttpUtility]::UrlEncode($Query)
$Fields = [System.Web.HttpUtility]::UrlEncode($Fields)
$LimitStr = -Join ("sysparm_limit=", $Limit.toString())

if ((-not $SetCredential) -and (Test-Path .\snow_cred.xml)){
    $cred = Import-Clixml -Path .\snow_cred.xml
} else {
    $cred = Get-Credential
    $cred | Export-Clixml -Path .\snow_cred.xml
}

# build uri
$Uri = -Join ($InstanceName, $Table)

# optionally add query / limit / fields
if ($Query){
    $Uri = -Join ($Uri, "?sysparm_query=", $Query)
}

if ($Limit){
    if ($Query){
        $Uri = -Join ($Uri, "&", $LimitStr)
    } else {
        $Uri = -Join ($Uri, "?", $LimitStr)
    }
}

if ($Fields){
    if ($Query -or $Limit){
        $Uri = -Join ($Uri, "&sysparm_fields=", $Fields)
    } else {
        $Uri = -Join ($Uri, "?sysparm_fields=", $Fields)
    }
}

#"Instance: " + $InstanceName
#"Table: " + $Table
#"Query: " + $Query
#"Limit: " + $Limit
#"Uri: " + $Uri

$response = Invoke-WebRequest -Method Get -Credential $cred -Uri $Uri -ProxyUseDefaultCredentials -Proxy 'https://example.com'

$Uri

if ($response.StatusCode -ne 200){
    $response.StatusCode
} else {
    $response.StatusCode.ToString() + " - " + $response.StatusDescription
    $obj = $response.Content | ConvertFrom-Json
    $obj.result
#    $obj.result | ForEach-Object -Process { $_.name + " - " + $_.sys_class_name + " - " + $_.sys_created_by }
}