Получить значения из Invoke-RestMethod PSobject

Я использую Invoke-RestMethod чтобы получить данные о сотрудниках из нашей HRIS (информационной системы управления персоналом):

$employee = Invoke-RestMethod -Method Get -Headers $headers -Uri $URI -ContentType 'application/json'

Он возвращает этот PSobject, и у меня возникают проблемы со ссылкой на значения:

employees                                                                                                                                                                                                                                                        
---------                                                                                                                                                                                                                                                        
{@{account_id=12345; username=12345; is_locked=False; employee_id=12345; first_name=John; middle_initial=Roger; last_name=Doe; full_name=John Roger Doe}}

Я пытаюсь получить отдельные значения для использования в качестве переменных в остальной части скрипта.


Что я пробовал:

Write-Output ($employee | Select -ExpandProperty "first_name")

Write-Output $employee.Properties["first_name"].Value


Полный сценарий по запросу

$APIkey = "supersecret"
$KronosAccount = Read-Host -Prompt 'Input your Kronos admin ID'
$KronosPassword = Read-Host -Prompt 'Input your Kronos password' -AsSecureString
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($KronosPassword)
$PlainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)

$loginheaders = @{}
$loginheaders.Add("Api-Key", $APIkey)
$loginheaders.Add("Accept", "application/json")


$json = @{
  credentials = @{
    username = $KronosAccount
    password = $PlainPassword
    company = '123456'
  }
}

$token = Invoke-RestMethod -Method Post -Headers $loginheaders -Uri https://secure3.saashr.com/ta/rest/v1/login -ContentType 'application/json' -Body (ConvertTo-json $json) 
$tokenvalue = ($token | Select -ExpandProperty "token")

$NewEmployeeID = Read-Host -Prompt 'Input the employee ID to create an account for'

$headers = @{}
$headers.Add("Api-Key", $APIkey)
$headers.Add("Accept", "application/json")
$headers.Add("Authentication", "Bearer $tokenvalue")

$URI = "https://secure3.saashr.com/ta/rest/v1/employees/?company=123456&filter=username::$NewEmployeeID"
$employee = Invoke-WebRequest -Method Get -Headers $headers -Uri $URI -ContentType 'application/json'

$employee.employees

person Brian    schedule 20.07.2017    source источник


Ответы (1)


хорошо, у вас есть некоторые фанки вещи происходит там. Значение, которое вы представили в качестве возвращаемого результата вашего Invoke-RestMethod, на самом деле является десериализованным объектом PowerShell, а не JSON. Похоже, что в какой-то момент его кавычки тоже были удалены.

Если вы сделаете это: $x = @{account_id="12345"; username="12345"; is_locked="False"; employee_id="12345"; first_name="John"; middle_initial="Roger"; last_name="Doe"; full_name="John Roger Doe"}

то вы можете сделать это:

$x.full_name

и получите желаемое значение. Я думаю, вы захотите обратиться к тому, кто размещает этот API, и попросить их исправить это там.

Чтобы убедиться, что проблема не возникает на стороне клиента, можете ли вы заменить Invoke-RestRequest на Invoke-WebRequest (он должен принимать все те же параметры). Затем запустите $employee.rawContent и опубликуйте результат. Это позволит нам точно знать, что происходит по проводам.

person Ty Savercool    schedule 20.07.2017
comment
Что там причудливого? Почему Invoke-RestMethod должен возвращать строку JSON? - person Clijsters; 20.07.2017
comment
Invoke-RestMethod в конце концов не вернет JSON, он получит JSON и разберет его в объект PowerShell. Учитывая приведенный выше вывод, проанализированный объект PowerShell содержит десериализованный объект PowerShell, только без ожидаемых двойных кавычек. Если я использую Invoke-RestMethod для API, который возвращает JSON, я получаю действительный проанализированный объект PowerShell. В выводе Брайана у него есть свойство верхнего уровня, содержащее не проанализированные данные. - person Ty Savercool; 20.07.2017
comment
опущены заголовки из-за длины комментария. Это от $employee.rawContent {сотрудников:[{account_id:123456,username:123456,is_locked:false,employee_id:123456,first_name:JOhn,middle_initial:Mac,last_name:Doe,full_name:John Mac Doe}]}` - person Brian; 21.07.2017
comment
Это странно, потому что Invoke-WebRequest возвращает вам действительный JSON. Я взял строку ответа и запустил ее ConverFrom-JSON для проверки следующим образом: $x = '{"employees":[{"account_id":123456,"username":"123456","is_l‌​ocked":false,"employ‌​ee_id":"123456","fir‌​st_name":"JOhn","mid‌​dle_initial":"Mac","‌​last_name":"Doe","fu‌​ll_name":"John Mac Doe"}]}' $y = $x | Convert-FromJSON Затем я вывел данные: $y.employees и все работает нормально. Это предполагает, что код, связанный с Invoke-RestMethod, возится с его содержимым. Можешь сделать для меня 2 вещи (см. далее) - person Ty Savercool; 21.07.2017
comment
1. Запустите это, чтобы убедиться, что оно не работает: $x = Invoke-RestMethod -Method Get -Headers $headers -Uri $URI $x.employees 2. Опубликуйте свой полный сценарий, чтобы я мог его изучить. В качестве обходного пути нет причин, по которым вы не можете использовать приведенный выше код Invoke-WebRequest и ConvertFrom-JSON вместо Invoke-RestMethod. - person Ty Savercool; 21.07.2017
comment
Спасибо, Тай. Попытка $x.employees не привела ни к каким выводам и ошибкам, просто вернулась к приглашению. При совместном выполнении методов invoke-webrequest и convertfrom-json я получаю ту же структуру, что и invoke-restmethod. - person Brian; 24.07.2017
comment
Можете ли вы опубликовать свой сценарий полностью, а также опубликовать результаты $PSVersionTable Если эта служба REST общедоступна, не могли бы вы также опубликовать этот URL-адрес? - person Ty Savercool; 24.07.2017
comment
Тай, я обновил OP полным сценарием. Имя Значение ---- ----- PSVersion 4.0 WSManStackVersion 3.0 SerializationVersion 1.1.0.1 CLRVersion 4.0.30319.42000 BuildVersion 6.3.9600.17400 PSCompatibleVersions {1.0, 2.0, 3.0, 4.0} PSRemotingProtocolVersion 2.2 - person Brian; 24.07.2017
comment
Тай, я напутал, когда я пытался сделать $x.employees, я использовал invoke-webrequest, а не invoke-resmethod Когда я это исправил, я смог получить правильно отформатированный объект! - person Brian; 24.07.2017
comment
отлично, только что хотел указать, что у вас есть веб-запрос без преобразования. Рад, что ты в деле. - person Ty Savercool; 24.07.2017