PowerShell 获取带有正文的请求

标签 powershell rest python-requests mlflow

我正在尝试this api endpoint 。 我可以在 python 中调用它,没问题,如下所示

get_model_versions={
    "filter":"name='model_name'",
    "order_by":["version DESC"],
    "max_results":1
}

init_get = requests.get("baseurl/api/2.0/preview/mlflow/model-versions/search",headers=header_read,json=get_model_versions)

但是,我似乎找不到一种方法让它在 Powershell 中工作。

首先,powershell“get”Invoke-RestMethod 不接受正文

然后我似乎找不到一种方法将其作为查询字符串附加到 Powershell 中。

我已经尝试过(以及其他失败的尝试),以下

$get_model_versions=([PSCustomObject]@{
  filter = "name=`'model_name`'"
  order_by = @("version desc")
} | ConvertTo-Json)

$resp=Invoke-RestMethod -Uri $searchuri -Headers $auth -Method Get -Body $get_model_versions

但这给了我一个错误,即主体不能与 get 方法一起使用

尝试将其附加为查询字符串(就像我什至只保留名称过滤器并删除其他过滤器一样),也会失败

$searchuri= "baseurl/api/2.0/preview/mlflow/model-versions/search?filter=""name==model_name"""

$resp=Invoke-RestMethod -Uri $searchuri -Headers $auth -Method Get

失败

{"error_code":"INVALID_PARAMETER_VALUE","message":"Unsupported filter query : `\"name==model_name\"`. Unsupported operator."}

如何在 Powershell 中模仿与 Python 中相同的行为?

编辑1:我确实尝试对查询参数进行编码(也许我做错了),但这是我失败的尝试的样子

$encodedvalue = [System.Web.HttpUtility]::UrlEncode("`"name='model_name'`"")
$searchuri= "baseurl/api/2.0/preview/mlflow/model-versions/search?filter=$encodedvalue"

$resp=Invoke-RestMethod -Uri $searchuri -Headers $auth -Method Get

但这也给了我

"Unsupported filter query : `\"name='model_name'\"`. Unsupported operator."

我还在 Postman 中成功尝试过传递原始 json 正文(与 python 相同),当我在 Postman 中查看生成的 PowerShell 代码时,我看到了这一点

$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Authorization", "Bearer token")
$headers.Add("Content-Type", "application/json")

$body = "{
`n    `"filter`":`"name='model_name'`",
`n    `"order_by`":[`"version DESC`"],
`n    `"max_results`":1
`n}
`n"

$response = Invoke-RestMethod 'baseurl/api/2.0/preview/mlflow/model-versions/search' -Method 'GET' -Headers $headers -Body $body
$response | ConvertTo-Json

但是当然会失败(如果你在 powershell 编辑器中复制它并运行它

Invoke-RestMethod : Cannot send a content-body with this verb-type

最佳答案

苦苦挣扎半天,终于找到答案了!

关键在于文档here 。 尤其是这一部分

enter image description here

因此,如果您想在 powershell 中传递“get”方法的主体,请将其作为哈希表传递。

所以,最终答案是

$query=@{"filter"="name='model_name'";"order_by"=@("version DESC"); "max_results"=1};
$searchuri="baseurl/api/2.0/preview/mlflow/model-versions/search"

$resp=Invoke-RestMethod -Uri $searchuri -Headers $auth -Method Get -Body $query

希望这可以帮助正在寻找类似内容的人。

关于PowerShell 获取带有正文的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72250896/

相关文章:

variables - 如何在 PowerShell 中测试变量是否超过八个字符?

rest - 无法使用golang中的gorilla mux从url读取变量

python - 如何使用Python Request实现ajax请求

java - 在 dropwizard REST API 中返回两个具有相同值的字段

rest - RESTful API 上搜索资源的缓存控制策略

python - 如何通过 TOR 和 Privoxy 使用 Python 请求获取 HTTPS 内容

python的请求显示奇怪的语言而不是阿拉伯语

powershell - 使用Powershell为按日期创建的文件创建7z存档

powershell - 如何从另一个 PS session 启动一个新的 PowerShell session ,并运行带有 splatted 参数的 CmdLet

string - 获取 .trim/-trim、.replace/-replace、.split/-split 和其他字符串运算符的帮助