Snow-Shell/servicenow-powershell

Optional to add version to url

Closed this issue · 5 comments

I am trying to use Get-ServiceNowTable -Query 'sys_updated_on>javascript:gs.minutesAgoStart(15)' which gives the following error:
Invoke-RestMethod : The remote server returned an error: (404) Not Found.

If i use Invoke-RestMethod directly and use the same uri but remove /v1 from it, it works.

https://github.com/Sam-Martin/servicenow-powershell/blob/59d06b7650402a9c2af28a7cad12c9180d89ed8a/ServiceNow/Public/Get-ServiceNowTable.ps1#L61

Maybe another parameter which skips /v1 or something can be an option?

Hey @Robert-LTH. I just tried this and had no issues. Can you provide the complete uri from both calls (-verbose) as well as the full command you are running?

$table = "cmdb_ci_pc_hardware"
if (-not $Credential) {
$Credential = [pscredential]::new($Configuration.SnowUsername, (ConvertTo-SecureString -AsPlainText -Force -String $Configuration.SnowPassword))
}
Set-ServiceNowAuth -Url $ServiceNowHostname -Credentials $Credential -Verbose
Get-ServiceNowTable -Table $table -Query 'sys_updated_on>javascript:gs.endOfLastHour()^ORsys_created_on>javascript:gs.endOfLastHour()^install_status=7^ORinstall_status=8' -Verbose

VERBOSE: GET https://instancename.service-now.com/api/now/v1/table/cmdb_ci_pc_hardware?sysparm_display_value=true&sysparm_query=sys_updated_on>javascript:gs.endOfLastHour()^ORsys_created_on>javascript:gs.endOfLastHour()^install_status=7^ORinstall_status=8&sysparm_limit=10 with 0-byte payload

Gives me error:
Invoke-RestMethod : The remote server returned an error: (404) Not Found.

If I run Invoke RestMethod without /v1 like this:

$Query = "install_status=7^sys_updated_on>javascript:gs.minutesAgoStart(15)^ORsys_created_on>javascript:gs.minutesAgoStart(15)"
$SNUri = "https://{0}/api/now/table/{1}?sysparm_query={2}" -f $ServiceNowHostname,$table,$Query
Invoke-RestMethod -Verbose -Uri $SNUri -Credential $Credential

VERBOSE: GET https://instancename.service-now.com/api/now/table/cmdb_ci_pc_hardware?sysparm_query=install_status=7^sys_updated_on>javascript:gs.minutesAgoStart(15)^ORsys_created_on>javascript:gs.minutesAgoStart(15) with 0-byte payload
VERBOSE: received -1-byte response of content type application/json;charset=UTF-8

You will get a 404 if no results are returned with v1 of the api. v2 (and no version provided) will return an empty result.

Your 2 queries are slightly different. Can you run the same query you did with Get-ServiceNowTable with Invoke-RestMethod and see if any results come back? If empty results then it explains what you are seeing. If you get results back, we'll need to keep digging.

With that said, just want to make sure I understood the original ask. Are you reporting this as a bug or asking for us to change the ServiceNow api version we utilize?

I am sorry, I guess I should have read the docs before posting here. I expanded the timeframe in my search and you were right, it returns items as expected.

I guess its a mix of both. If there are different versions that can be queried wouldn't it make sense to default to v1 but let the user choose?

Thank you for quick responses!

Cool, glad it's working.

I like the idea of an option and we can mark this as an enhancement. I'd personally like to default to the latest and make prior versions optional as v1 will get more and more out of date, but have to give some thought as to how we could cutover without affecting existing module users...