我们正在将发布管道从 Azure 内置发布迁移到基于 YAML 代码的管道。在我们开始研究 API 管理之前,一切进展顺利。我们已成功使用 az apim import 导入 OpenAPI 端点,但正在努力寻找导入策略的解决方案。
旧的发布管道使用 Set-AzApiManagementPolicy 函数,但我们渴望摆脱这一点。作为旁注,我们确实尝试使用此功能,但它抱怨必须使用 Connect-AzAccount 登录。第一个调用是在 AzureCli@2 任务中进行的,没有 Connect-AzAccount 调用。旧版本工作正常并创建了策略。
查看此 github 问题,这意味着 az apim 将扩展以支持政策,但据我们所知,这还没有发生。
https://github.com/Azure/azure-cli/issues/14695
该问题还讨论了使用 REST 端点来更新策略,这似乎是一个很好的折中办法。其余 API 的详细信息请参见此处。
尽管那篇文章似乎遗漏了早期问题报告中包含的 apis 参数。
因此,我们已经配置了包含 apis 参数的 url,并使用 az rest --method put 来发出请求。一个简单的政策主体定义为:
$xml = "<policies><inbound/><backend><forward-request/></backend><outbound/></policies>" | Out-String
$body='{"properties":{"format":"xml","value":"' + $xml + '"}}' | Out-String
$body=$body.Replace('"','\"') | Out-String
所以我们的 az 休息电话是:
az rest --method PUT --uri $uri --body $body
发出后会生成以下错误:
az : < was unexpected at this time.
At C:\Data\apims1.ps1:11 char:1
+ az rest --method PUT --uri $uri --body $body
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (< was unexpected at this time.:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
如果我们修改正文以不包含 xml,如下所示:
$body='{"properties":{"format":"xml","value":""}}' | Out-String
$body=$body.Replace('"','\"') | Out-String
它会引发以下错误,这意味着它需要 xml,因为它找不到根元素:
az : ERROR: Bad Request({"error":{"code":"ValidationError","message":"One or more fields contain incorrect values:","details":[{"code":"ValidationError","target":"representation","message":"Root element is missing."}]}})
At C:\Data\apims1.ps1:11 char:1
+ az rest --method PUT --uri $uri --body $body
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (ERROR: Bad Requ... missing."}]}}):String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
我们尝试使用 & 符号 lt/gt 以及 & 符号 # 60/62 对 < and > 进行编码;还报告了其他错误。
非常感谢您为解决此问题提供任何帮助。 TIA
我也为
az rest
苦苦挣扎,但我认为你不应该对 Invoke-RestMethod
有这样的问题。试试这个:
$accessToken = (az account get-access-token | ConvertFrom-Json).accessToken
$headers = @{Authorization="Bearer $accessToken"}
Invoke-RestMethod -Method Put -Uri $uri -Body $body -Headers $headers