我能够得到一个PUT工作!
如何从 Invoke-RestMethod 获取丰富的错误响应数据
首先,我在这里使用了这篇博Invoke-RestMethod文,它有一个很好的方法来检索一个或WebRequestcmdlet的完整错误消息。
在他的方法中,首先定义了一个Function,叫做Failure。
function Failure {
$global:helpme = $body
$global:helpmoref = $moref
$global:result = $_.Exception.Response.GetResponseStream()
$global:reader = New-Object System.IO.StreamReader($global:result)
$global:responseBody = $global:reader.ReadToEnd();
Write-Host -BackgroundColor:Black -ForegroundColor:Red "Status: A system exception was caught."
Write-Host -BackgroundColor:Black -ForegroundColor:Red $global:responsebody
Write-Host -BackgroundColor:Black -ForegroundColor:Red "The request body has been saved to `$global:helpme"
break
}
然后,像这样将所有 Invoke-RestMethod 调用包装在 try Catch 块中。
try {
$e = Invoke-WebRequest 'https://api.us.onelogin.com/api/1/users/$id' `
-Headers @{ Authorization = "bearer:$token" } `
-Body ( @{ phone = "7709746046" } | ConvertTo-Json ) `
-Method Put `
-ErrorAction:Stop `
-ContentType 'application/json'
}
catch {Failure}
现在,当您遇到错误时,您可以看到实际消息,如下所示
> Status: A system exception was caught.
{"status":{"error":true,"code":400,"type":"bad request","message":{"description":"notes is not a valid attribute for user model","attribute":"notes"}}}
The request body has been saved to $global:helpme
这对帮助我摆脱遇到的错误非常有帮助,并且我能够使用PUT动词更新用户条目并使其正常工作。
解决您的问题
我只需要对您的代码进行两次更改即可使其正常工作。
首先,在 URI 周围加上引号,因为您的示例代码没有它们,而且您必须在哈希表中的字符串周围加上引号。
最后,将您的正文内容通过管道传输到ConvertTo-JSON,否则数据将作为字符串发送,就像您在 Fiddler 中找到的那样。
有了这两个更改,这是我的请求和响应
$Splat = @{
Method = 'PUT'
Uri = 'https://api.us.onelogin.com/api/1/users/27697924/add_roles'
ContentType = "application/json"
Headers = @{authorization = "bearer:$token" }
Body = @{role_id_array = @(143175)} | ConvertTo-Json
}
try {Invoke-RestMethod @Splat -ErrorAction Stop }
catch {Failure}
这是回应:
status
------
@{type=success; message=Success; error=False; code=200}
更新:我们做到了,现在已经修复了!
如果你认为 PowerShell 应该为非 200 状态代码呈现实际的服务器响应,那么请帮助在 Github上的 PowerShell项目页面上引起对这个未解决问题的关注。
添加您的反馈或竖起大拇指,我们可能会在该语言的未来版本中对此进行更改。
从 PowerShell v6.1 开始,此问题现已修复