gpt4 book ai didi

rest - OneLogin REST API 与 PowerShell 的 Invoke-RestMethod

转载 作者:行者123 更新时间:2023-12-01 09:18:06 24 4
gpt4 key购买 nike

我正在使用 OneLogin REST API,但似乎无法使用 PUT 方法进行任何调用。当我在 Postman 中进行测试时,我可以像这样传递一个原始 JSON 正文:

{
"role_id_array": [
115028
]
}

到终点:

https://api.us.onelogin.com/api/1/users//add_roles

这很好用。但是,当我尝试对 PowerShell 的 Invoke-RestMethod 命令执行相同操作时,我收到 400 Bad Request 错误。我的代码如下所示:

$Splat = @{
Method = $Method
Uri = https://api.us.onelogin.com/api/1/users/12345678/add_roles
ContentType = "application/json"
Headers = @{authorization = "bearer:$($Token.access_token)"}
Body = @{role_id_array = @(123456)}
}

Invoke-RestMethod @Splat

到目前为止,我对任何 GET 调用都没有问题,只有 PUT 调用。此外,如果我运行通过 ConvertTo-Json 传入的 Body 哈希表,输出看起来就像上面的工作示例。有人对为什么这不起作用有任何想法吗?

最佳答案

我能够让 PUT 工作!

如何从Invoke-RestMethod获取丰富的错误响应数据

首先,我使用了 this blog post here它有一个很好的方法来检索 Invoke-RestMethodWebRequest cmdlet 的完整错误消息。

在他的方法中,先定义一个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 block 中。

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 状态代码呈现实际的服务器响应,请帮助提请注意此 open issue on the PowerShell Github 上的项目页面。

添加您的反馈或竖起大拇指,我们可能会在该语言的 future 版本中对此进行更改。

此问题现已从 PowerShell v6.1 开始修复

关于rest - OneLogin REST API 与 PowerShell 的 Invoke-RestMethod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39319680/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com