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'"}
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.
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();
}
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!
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)
}