0

I am trying to use a REST API to configure some alerts in RecoverPoint for Virtual Machines (RP4VM). I am trying to enter multiple filters at the same using json. The json file looks like this:

[
{
  "JsonSubType": "SystemEventLogsFilter",
  "level": "WARNING",
  "scope": "NORMAL",
  "eventsIDs": [],
  "filterUID": {
    "id": 1570417688566256135
  },
  "name": "RPA_issue",
  "topic": "RPA",
  "groupsToInclude": null
},
{
  "JsonSubType": "SystemEventLogsFilter",
  "level": "WARNING",
  "scope": "ADVANCED",
  "eventsIDs": [],
  "filterUID": {
    "id": -1728986321682574312
  },
  "name": "cluster_events",
  "topic": "CLUSTER",
  "groupsToInclude": null
}
]

When I try to run the script I get an error:

Unexpected token (START_ARRAY), expected START_OBJECT: need JSON Object to contain As.PROPERTY type information (for class com.emc.fapi.version5_2.commons.SystemEventLogsFilter)
 at [Source: org.apache.catalina.connector.CoyoteInputStream@75b592c2; line: 1, column: 1]

If I remove the square brackets it does the first value but not the second. Is this an issue with my code or an issue with theirs?

The script:

$rp4vmcl = import-csv -Path .\test_clusters.csv
$credential = Get-Credential
$username = $credential.GetNetworkCredential().UserName
$password = $credential.GetNetworkCredential().password
$credPair = "$($username):$($password)"
$encodedCredentials = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($credPair))
$headers = @{ 
    Authorization = "Basic $encodedCredentials"; 
    "Accept" = "application/json";
    "Content-Type" = "application/json"
}
$comp = "/system/event_logs_filters"
$json = Get-Content .\event_log_filter.json -Raw
foreach ($s in $rp4vmcl) {
    $cluster = $s.cluster_name
    $uid = $s.cluster_uid
    $curl = $s.cluster_url
    $url = "$curl$comp"
    $cluster
    $results = Invoke-RestMethod -Method POST -uri $url -SkipCertificateCheck -Headers $headers -Body $json
}
Andrew Madsen
  • 155
  • 1
  • 12

1 Answers1

2

If the recipient expect one Call per Json Object it will not be able to handle arrays. It's totally dependant from the implementation of the webservice. Btw, better change the body:

$results = Invoke-RestMethod -Method POST -uri $url -SkipCertificateCheck -Headers $headers -Body ([System.Text.Encoding]::UTF8.GetBytes($json))

Try this first, and if this is doesnt help, loop through the elemnts and call the webservice individual:

    $jsonObject = $json | ConvertFrom-Json
    $results = @()
    $jsonObject | foreach {
    $json = $_  | ConvertTo-Json -Depth 99
    $results += Invoke-RestMethod -Method POST -uri $url -SkipCertificateCheck -Headers $headers -Body ([System.Text.Encoding]::UTF8.GetBytes($json))
    }

Btw, the invoke-restmethod is buggy in powershell < 6 Version, so if youre will with the standard V5 Windows Version, check the response headers via invoke-webservice, and if the response header is:

"application/json"

and not

"application/json; charset=utf-8"

powershell will misinterpret this as a windows encoding. So if youree experiencing encoding issues, you have four options:

1.) if you can modify the webservice, change the response header

2.) switch to a newer powershell version (v7 is recommended)

3.) build your own webservice call directly via the .net cmdlets

4.) use the invoke-webservice, write the answer directly into a file with the OutFile Paramater

see also: Powershell Invoke-RestMethod incorrect character

Farbkreis
  • 604
  • 3
  • 12
  • Running PS 7. The only issue I am running into is not being able to do multiple inserts. I have a feeling it is the vendors code. – Andrew Madsen Jun 03 '20 at 20:53
  • If the webservice can not handle multiple inserts, its by design of the vendor and you have to do the calls individually – Farbkreis Jun 03 '20 at 20:55