Powershell глотает ответ об ошибке REST - PullRequest
1 голос
/ 14 июня 2019

Я использую Invoke-WebRequest в Powershell, и всякий раз, когда моя конечная точка API определяет, что мой запрос недействителен, он, очевидно, отклоняет запрос и отправляет обратно HTTP-код ошибки, например (400) Bad Request, но в нем также указывается причина ошибка (предоставляется поставщиком API), но она не включена в журналы внутри PowerShell.

Я подтвердил, что подробная ошибка отправлена ​​обратно, потому что я вижу ее в PostMan, и поставщик подтвердил то же самое. Powershell просто не хочет показывать это. Вот пример моего кода и генерируемого им ответа.

Invoke-WebRequest -Credential $cred -Uri $url -Method POST -Body $json -ContentType 'application/json'
Invoke-WebRequest : The remote server returned an error: (400) Bad Request.
At \\*****\******$\Appsense\Desktop\Untitled2.ps1:42 char:1
+ Invoke-WebRequest -Credential $cred -Uri $url -Method POST -Body $jso ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) 
    [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands. 
   InvokeWebRequestCommand

Как мне записать это более подробное сообщение об ошибке?

1 Ответ

1 голос
/ 14 июня 2019

Две части к этому.Сначала нужно, чтобы он выдавал завершающую ошибку с -ErrorAction Stop.Это позволяет нам затем использовать блок try / catch для отлова исключения.С помощью исключения мы можем получить подробный ответ, сохраненный в описании состояния исключения.Это подходит для большинства запросов.

Чтобы получить текст сообщения, необходимо выполнить еще несколько шагов.Поскольку мы получаем объект WebResponse , для нас нет параметра «Хорошее» Сообщение.Поэтому мы должны использовать StreamReader для потоковой передачи содержимого сами:

try
{
    $Response = Invoke-WebRequest -Credential $cred -Uri $url -Method POST -Body $json -ContentType 'application/json' -ErrorAction Stop
    # This will only execute if the Invoke-WebRequest is successful.
    $StatusCode = $Response.StatusCode
}
catch
{
    #Excepion - Display error codes
    Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__ 
    Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription

    #Get body of me
    $streamReader = [System.IO.StreamReader]::new($_.Exception.Response.GetResponseStream())
    $ErrResp = $streamReader.ReadToEnd() | ConvertFrom-Json
    $streamReader.Close()
    Write-Host $ErrResp
}
...