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
}
我在 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
}