当我运行下面的语句时
Invoke-RestMethod "https://api.mysite.com/the/endpoint" `
-Body (ConvertTo-Json $data) `
-ContentType "application/json" `
-Headers $DefaultHttpHeaders `
-Method Post
端点返回400 Bad Request
,这会导致PowerShell显示以下不太有用的消息:
Invoke-WebRequest : The remote server returned an error: (400) Bad Request.
At line:1 char:1
+ Invoke-WebRequest "https://api.mysite.com/the/endpoint" -Body ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
如何获取响应的主体,它可能会告诉我发送的请求有什么问题?
9条答案
按热度按时间j9per5c41#
PowerShell
Invoke-WebRequest
和Invoke-RestMethod
存在一个已知问题,当状态代码为错误(4xx或5xx)时,shell会吃掉响应正文。听起来您正在寻找的JSON内容就是以这种方式蒸发的。您可以使用$_.Exception.Response.GetResponseStream()
在catch块中获取响应正文jgwigjjp2#
根据Invoke-RestMethod文档,cmdlet可以根据其接收的内容返回不同的类型。将cmdlet输出分配给变量(
$resp = Invoke-RestMethod (...)
),然后检查类型是否为HtmlWebResponseObject
($resp.gettype()
)。然后您将拥有许多可供使用的属性,如BaseResponse、Content和StatusCode。如果
$resp
是其他类型(字符串,psobject,在本例中很可能为null),则错误消息The remote server returned an error: (400) Bad Request
似乎是响应正文,仅从html中剥离(我在我的一些方法上测试了这一点),甚至可能被截断。如果您想要提取它,请使用common参数运行cmdlet以存储错误消息:Invoke-RestMethod (...) -ErrorVariable RespErr
,它将存在$RespErr
变量中。编辑:
好了,我明白了,这是很明显的:). Invoke-RestMethod抛出一个错误,所以让我们抓住它:
这里是你需要的,特别是在WebResponse对象中。我列出了3个吸引眼球的属性,还有更多。此外,如果你存储
$_
而不是$_.Exception
,那么可能已经为你提取了一些PowerShell属性,但我不希望没有比.Exception.Response
更有意义的属性。yuvru6vn3#
$RespErr将提供有关BadRequest的更多详细信息,在我的示例中,它
$响应错误;
它看起来像它只在本地主机工作,我尝试与我的实际服务器它不工作。
另一个尝试的方法是
1tu0hz3e4#
无论是200还是400,都可以毫无例外地获得HTTP响应:
Powershell 7推出
-SkipHttpErrorCheck
👏它适用于
Invoke-WebRequest
和Invoke-RestMethod
:MS文档中指出:
此参数使cmdlet忽略HTTP错误状态并继续处理响应。错误响应将像成功一样写入管道。
piv4azn75#
对我来说,它只在一个纠缠上下文中工作,当设置流位置为0之前阅读它。
z4iuyo4d6#
如果你只是在响应
StatusCode
和Content
之后,这里有一个解决这个问题的新方法,不需要大量混乱的try/catch和手动阅读响应流:据我所知,
ErrorRecord.ErrorDetails.Message
包含的属性与Microsoft.PowerShell.Commands.WebResponseObject.Content
的属性完全相同,在成功调用Invoke-WebRequest
时,它将返回给您,而无需执行所有GetResponseStream()
爵士乐。py49o6xq7#
从服务器发送的文本响应包含在error变量中的以下位置:
fnatzsnv8#
虽然不完全符合OP的预期;我有一个类似的例子,想看到发送请求的主体/头,而不是响应。解决方案是
-SessionVariable VarNameHere
-然后您可以检查这个变量,看到发送请求的确切内容。uqxowvwt9#
您可以使用HTTPClient来获得原始响应: