46

Invoke-RestMethod 呼び出しは、以下の非常に役に立たない例外のみを返し、(私が知る限り) 本文コンテンツ (フィドラー トレース結果に表示される JSON オブジェクト) を収集することはできません。もしそうなら、これはかなり悪い実装のようです。なぜなら、http 500 の定義は非常に具体的であり、クライアントはトラブルシューティングを支援するために応答の本文を返す必要があるからです... 何か不足していますか?

invoke-restmethod -method Post -uri "https://api-stage.enviance.com/ver2/EqlService.svc/eql" -Body (ConvertTo-Json $eqlhash)  -Headers @{"Authorization"="Enviance $session"}

invoke-restmethod : リモート サーバーがエラーを返しました: (500) 内部サーバー エラー。行:1 文字:9...

以下のフィドラートレース

HTTP/1.1 500 Internal Server Error Connection: close Date: Thu, 12 Sep 2013 17:35:00 GMT Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET X-AspNet-Version: 2.0.50727 EnvApi-バージョン: 2.0,2.0 EnvApi-Remaining-Calls: 994,994 EnvApi-Remaining-Interval: 2684,2684 Cache-Control: no-cache プラグマ: no-cache Expires: -1 Content-Type: text/csv; 文字セット=utf-8

{"errorNumber":0,"メッセージ":"現在のユーザーには、テーブル 'CustomFieldTemplate' からデータを取得する権限がありません"}

4

6 に答える 6

29

このソリューションは、PowerShell 6 では機能しなくなりました。サポートしていませんGetResponseStream()。代わりに使用

try {
    $result = Invoke-WebRequest ...
}
catch {
    $_.ErrorDetails.Message
}

PowerShell 6 以前をサポートする短いヘルパー関数を作成しました。

function ParseErrorForResponseBody($Error) {
    if ($PSVersionTable.PSVersion.Major -lt 6) {
        if ($Error.Exception.Response) {  
            $Reader = New-Object System.IO.StreamReader($Error.Exception.Response.GetResponseStream())
            $Reader.BaseStream.Position = 0
            $Reader.DiscardBufferedData()
            $ResponseBody = $Reader.ReadToEnd()
            if ($ResponseBody.StartsWith('{')) {
                $ResponseBody = $ResponseBody | ConvertFrom-Json
            }
            return $ResponseBody
        }
    }
    else {
        return $Error.ErrorDetails.Message
    }
}

try {
    $result = Invoke-WebRequest ...
}
catch {
    ParseErrorForResponseBody($_)
}
于 2018-01-08T16:52:18.020 に答える
12

私の問題に対する答えを探していると、このスレッドが見つかりました。

これらの解決策はうまくいきましたが、次の 2 行を追加する必要がありました。

 $reader.BaseStream.Position = 0
 $reader.DiscardBufferedData()

ありがとう!

于 2014-10-28T13:05:30.197 に答える