Comment faire pour que Powershell invoque-Restmethod renvoie le corps de la réponse http 500 code

Invoke-RestMethod call retourne seulement l'exception très inutile ci-dessous et ne vous permet pas (pour autant que je puisse dire) de récupérer le contenu du corps (objet JSON montré dans les résultats de trace fiddler). Cela semble une très mauvaise implémentation si c'est le cas parce que la définition http 500 est assez spécifique que le client devrait retourner le corps de la réponse pour aider à dépanner... Ai-je raté quelque chose?

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

invoke-restmethod : le serveur distant a renvoyé une erreur: (500) Erreur De Serveur Interne. À la ligne:1 char: 9...

Fiddler trace ci-dessous

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-Version: 2.0, 2.0 EnvApi-Appels Restants: 994 994 EnvApi-Appels Restants: 2684,2684 Cache-Control: no-cache " Pragma: no-cache Expire: -1 Type de Contenu: text / csv; charset=utf-8

{"errorNumber":0,"message":"utilisateur Actuel n'a pas de droits pour récupérer les données de la table 'CustomFieldTemplate'"}

21
demandé sur JorgeSandoval 2013-09-12 22:07:58

4 réponses

bien qu'il s'agisse d'un vieux fil, voici une réponse au problème avec les cmdlets Invoke-WebRequest et Invoke-RestMethod.

celui-ci me dérange depuis un certain temps. Comme toutes les réponses 4xx et 5xx génèrent une exception, vous devez attraper celle-ci et ensuite vous êtes en mesure d'extraire la réponse à partir de là cependant. L'utiliser comme ceci:

$resp = try { Invoke-WebRequest ... } catch { $_.Exception.Response }

maintenant $ REEE contient toujours tout ce que vous aimez.

21
répondu Anonymous 2013-11-30 23:02:24

L'autre réponse ne vous la réponse, mais vous avez besoin d'une étape supplémentaire pour obtenir le corps de la réponse, et pas seulement les en-têtes. Voici un extrait de code:

try {
        $result = Invoke-WebRequest ...
}
catch {
        $result = $_.Exception.Response.GetResponseStream()
        $reader = New-Object System.IO.StreamReader($result)
        $reader.BaseStream.Position = 0
        $reader.DiscardBufferedData()
        $responseBody = $reader.ReadToEnd();
}
57
répondu Noah Stahl 2016-05-31 15:22:41

cherchant une réponse à mon problème j'ai trouvé ce fil.

Ces solution a fonctionné pour moi, mais j'ai dû ajouter deux nouveaux ligne:

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

Merci!

12
répondu Cisco Cabe 2014-10-28 13:05:30

Cette solution ne fonctionne plus avec PowerShell 6 - elle ne supporte pas GetResponseStream(). Au lieu d'utiliser

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

j'ai écrit une fonction d'aide courte pour soutenir PowerShell 6 et plus tôt:

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 | ConvertTo-Json
            }
            return $ResponseBody
        }
    }
    else {
        return $Error.ErrorDetails.Message
    }
}

try {
    $result = Invoke-WebRequest ...
}
catch {
    ParseErrorForResponseBody($Error)
}
0
répondu Florian Feldhaus 2018-01-09 05:55:21