首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何让Powershell Invoke-Restmethod返回http 500代码响应的正文

如何让Powershell Invoke-Restmethod返回http 500代码响应的正文
EN

Stack Overflow用户
提问于 2013-09-13 02:07:59
回答 6查看 55.9K关注 0票数 46

Invoke-RestMethod调用在下面只返回非常无用的异常,并且(据我所知)不允许您收集主体内容(在fiddler跟踪结果中显示的JSON对象)。如果是这样的话,这似乎是一个相当糟糕的实现,因为http 500的定义非常具体,客户端应该返回响应的正文以帮助解决问题……我是不是遗漏了什么?

代码语言:javascript
复制
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行: char:9...

下面是Fiddler跟踪

HTTP/1.1 500内部服务器错误连接:关闭日期:清华,2013年9月12日17:35:00 GMT服务器: Microsoft-IIS/6.0 X-Powered By: ASP.NET X-AspNet-版本: 2.0.50727 EnvApi-版本: 2.0,2.0 EnvApi-剩余-调用: 994,994 EnvApi-剩余-间隔: 2684,2684缓存-控制:无缓存语法:无缓存过期:-1内容类型:文本/csv;字符集=utf-8

{"errorNumber":0,“message”:“当前用户没有从表‘CustomFieldTemplate’取数的权限”}

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-12-01 07:02:25

虽然是一个旧线程,但这里是cmdlets -WebRequest和Invoke-RestMethod问题的答案。

这个问题已经困扰我很长一段时间了。由于所有4xx和5xx响应都会生成异常,因此您必须捕获该异常,然后才能从那里提取响应。像这样使用它:

代码语言:javascript
复制
$resp = try { Invoke-WebRequest ... } catch { $_.Exception.Response }

现在,$resp总是包含您喜欢的所有内容。

票数 35
EN

Stack Overflow用户

发布于 2014-05-23 03:25:42

另一个答案确实得到了响应,但您需要一个额外的步骤来获取响应的实际正文,而不仅仅是头部。下面是一个代码片段:

代码语言:javascript
复制
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();
}
票数 102
EN

Stack Overflow用户

发布于 2018-01-09 00:52:18

此解决方案不再适用于PowerShell 6-它不支持GetResponseStream()。相反,请使用

代码语言:javascript
复制
try {
    $result = Invoke-WebRequest ...
}
catch {
    $_.ErrorDetails.Message
}

我写了一个简短的助手函数来支持PowerShell 6和更早的版本:

代码语言:javascript
复制
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($_)
}
票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18771424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档