使用PowerShell的Invoke-RestMethod的OneLogin REST API

Mat*_*abb 3 rest powershell onelogin

我正在使用OneLogin REST API,似乎无法使用PUT方法进行任何调用.当我在Postman中测试时,我可以传递一个原始的JSON体,如下所示:

{
   "role_id_array":  [
                        115028
                     ]
}
Run Code Online (Sandbox Code Playgroud)

到端点:

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
Run Code Online (Sandbox Code Playgroud)

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

Fox*_*loy 9

我能够PUT上班!

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

首先,我在这里使用了这篇博文,它有一个很好的方法来检索Invoke-RestMethodWebRequestcmdlet 的完整错误消息.

在他的方法中,首先定义一个名为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
}
Run Code Online (Sandbox Code Playgroud)

然后,将所有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}
Run Code Online (Sandbox Code Playgroud)

现在,当您遇到错误时,您可以看到实际的消息,就像这样

> 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
Run Code Online (Sandbox Code Playgroud)

这对帮助我摆脱遇到的错误非常有帮助,并且我能够使用PUT动词更新用户条目并使其工作.

解决您的问题

我只需对代码进行两处更改即可使其正常工作.

首先,在URI周围加上引号,因为您的示例代码没有它们,并且您必须在哈希表中包含字符串的引号.

最后,管理您的角色ID数组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}
Run Code Online (Sandbox Code Playgroud)

这是回复:

status                                                 
------                                                 
@{type=success; message=Success; error=False; code=200}
Run Code Online (Sandbox Code Playgroud)

更新:我们做到了,现在已经修复了!

如果您认为PowerShell应该呈现非200状态代码的实际服务器响应,那么请帮助在Github 上的PowerShell项目页面上引起对这个开放问题的注意.

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

从PowerShell v6.1开始,此问题现已解决