Private/Invoke-AbuseIPDBRequest.ps1

function Invoke-AbuseIPDBRequest {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]
        $Path,

        [Parameter()]
        [ValidateSet("get", "post", "delete", "put", "patch")]
        [string]
        $Method = "get",

        [Parameter()]
        [hashtable]
        $QueryParams = @{},

        [Parameter()]
        [hashtable]
        $Body = @{},

        [Parameter()]
        [hashtable]
        $Headers = @{}
    )

    begin {
        $requestParams = @{
            Uri     = "{0}{1}" -f ($script:baseURL, $Path)
            Headers = @{
                Key    = $script:apiKey
                Accept = "application/json"
            }
        }

        if ($PSBoundParameters.ContainsKey('Headers')) {
            foreach ($item in $Headers.GetEnumerator()) {
                $requestParams.Headers.Add($item.Key, $item.Value)
            }
        }


        if ($PSBoundParameters.ContainsKey('QueryParams')) {
            $query = @()
            foreach ($item in $QueryParams.GetEnumerator()) {
                $query += "{0}={1}" -f ($item.Key, [System.Web.HttpUtility]::UrlEncode($item.Value))
            }

            $requestParams.Uri += "?{0}" -f ($query -Join "&")
        }

        if ($PSBoundParameters.ContainsKey('Body')) {
            $query = @()
            foreach ($item in $Body.GetEnumerator()) {
                $query += "{0}={1}" -f ($item.Key, [System.Web.HttpUtility]::UrlEncode($item.Value))
            }

            $encodedBody = $query -join "&"
            $requestParams.Add("ContentType", "application/x-www-form-urlencoded")
            $requestParams.Add("Body", $encodedBody)
        }
    }

    process {
        try {
            Write-Verbose "$($requestParams.Method): $($requestParams.Uri)"
            Invoke-RestMethod @requestParams
        } catch {
            $StatusCode = $_.Exception.Response.StatusCode
            $ErrorMessage = $_.ErrorDetails.Message

            Write-Error "$([int]$StatusCode) $($StatusCode) - $($ErrorMessage)"
        }
    }

    end {}
}