1

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

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

4

1 回答 1

1

两个部分。首先你需要让它抛出一个终止错误-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
}
于 2019-06-14T15:45:35.787 回答