当服务器返回状态代码400时,使用powershell检索响应内容

ste*_*ary 3 powershell web-services

所以我通过powershell调用一个休息Web服务,如果你试图发布已经处理过的数据,它会响应一个400状态代码,以及状态代码它还会返回一个JSON响应:

{
    "statusCode": 400,
    "errorCode": "REQUEST_VALIDATION_ERROR",
    "message": "validation failed",
    "developerMessage": " MessageId-xxx already processed. No Need to process again."
}
Run Code Online (Sandbox Code Playgroud)

所以我尝试用一​​些powershell调用它并接收400状态代码并使用try/catch来处理这个以获取异常,但是响应中没有内容,我可以获得响应头,状态代码,状态消息等,但是我根本找不到访问JSON响应的方法,这里是我正在使用的powershell代码的格式:

$url = "https://example.com/webservice/status"
$cert = Get-ChildItem Cert:\CurrentUser\My\certthumbprintxxxxx
$headers = @{"tokenId" = "tokenxxxxx"}

$body = 
@"
{
...
 JSON data...
...
}
"@

try 
{
    $response = Invoke-WebRequest $url -Certificate $cert -Headers $headers -Method Post -Body $body
    }
catch
{
    $_.Exception.response
    }
Run Code Online (Sandbox Code Playgroud)

当我发送$_.Exception.response给Get-Member时,我可以看到没有内容属性.如何使用PowerShell访问响应中的消息?

Fab*_*ian 6

您可以通过ErrorDetails属性访问内容消息$_.ErrorDetails.Message.它返回一个字符串.

作为替代,你也可以直接读取使用WebResponse类类流$_.Exception.Response.GetResponseStream()(如描述在这里,我不得不把流,因为它似乎已经由PowerShell的阅读再次定位0)

   $s = $_.Exception.Response.GetResponseStream()
   $s.Position = 0;
   $sr = New-Object System.IO.StreamReader($s)
   $err = $sr.ReadToEnd()
   $sr.Close()
   $s.Close()
Run Code Online (Sandbox Code Playgroud)