2013-09-12 4 views
18

Вызов Invoke-RestMethod возвращает только очень бесполезное исключение ниже и, насколько я могу судить, позволяет вам собирать содержимое тела (показан объект JSON в результатах трассировки скрипача). Это кажется довольно плохой реализацией, если это так, потому что определение http 500 довольно специфично, что клиент должен вернуть тело ответа, чтобы помочь устранить неполадки ... Я что-то упустил?Как получить Powershell Invoke-Restmethod, чтобы вернуть тело ответа кода 500 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 : The remote server returned an error: (500) Internal Server Error. At line:1 char: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-Version: 2.0,2.0 EnvApi-Remaining-Calls: 994,994 EnvApi-Remaining-Interval: 2684,2684 Cache-Control: no-cache Pragma: no-cache Expires: -1 Content-Type: text/csv; charset=utf-8

{"errorNumber":0,"message":"Current user has no rights to retrieve data from table 'CustomFieldTemplate'"}

+0

Та же проблема в Invoke-WebRequest – JorgeSandoval

+0

Вместо загадочного записки в «Что нового в Powershell 4.0 предлагает (возможно), что эта проблема является ошибка и была исправлена ​​ http://technet.microsoft.com/en-us/library/hh857339.aspx#BKMK_bugs Под исправленных багов раздел:. командлет Invoke-RestMethod теперь возвращает все доступные результаты. – JorgeSandoval

ответ

19

Хотя старая нить, здесь ответ на проблемы с командлетов Invoke-WebRequest и Invoke-RestMethod.

Этот вопрос беспокоил меня в течение некоторого времени. Поскольку все ответы 4xx и 5xx генерируют исключение, вы должны поймать этот, а затем вы можете извлечь из него ответ. Используйте его так:

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

Теперь $ resp всегда содержит все, что вам нравится.

53

Другой ответ дает вам ответ, но вам нужен дополнительный шаг для получения фактического тела ответа, а не только заголовков. Вот фрагмент:

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(); 
} 
12

Поиск ответа для моей проблемы Я нашел эту тему.

Это решение работает для меня, но я должен был добавить две новые линии:

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

Спасибо!

+1

Мне тоже пришлось это сделать, я добавил эти строки до $ responseBody = $ reader.ReadToEnd(); – trevorism

0

Это решение больше не работает с 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 | ConvertTo-Json 
      } 
      return $ResponseBody 
     } 
    } 
    else { 
     return $Error.ErrorDetails.Message 
    } 
} 

try { 
    $result = Invoke-WebRequest ... 
} 
catch { 
    ParseErrorForResponseBody($Error) 
} 
Смежные вопросы