Powershell 正在吞下 REST 错误响应

Powershell is swallowing REST error response

我在 Powershell 中使用 Invoke-WebRequest,每当我的请求被目标 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

如何捕获更详细的错误消息?

这分为两部分。首先,您需要让它使用 -ErrorAction Stop 抛出一个终止错误。这允许我们使用 try/catch 块来捕获异常。有了异常,我们就可以得到存储在异常状态描述中的详细响应。这适用于大多数请求。

要获取邮件正文,还需要执行几个步骤。因为我们得到一个WebResponse对象,所以没有"Nice"消息参数给我们。所以我们必须自己使用 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
}